2013-01-04 23 views
41

tworzenie plików CSV z csv.DictReader jest wielki - ale mam pliki CSV z linii komentarz w (wskazane przez wartość mieszania na początku linii), na przykład:Python: pomiń komentarz linie oznaczone # w csv.DictReader

 
# step size=1.61853 
val0,val1,val2,hybridisation,temp,smattr 
0.206895,0.797923,0.202077,0.631199,0.368801,0.311052,0.688948,0.597237,0.402763 
-169.32,1,1.61853,2.04069e-92,1,0.000906546,0.999093,0.241356,0.758644,0.202382 
# adaptation finished 

Moduł CSV doesn't include any way to skip such lines.

Mogę łatwo zrobić coś hacky, ale wyobrażam sobie, że istnieje dobry sposób na owinięcie csv.DicReader wokół jakiegoś innego obiektu iteratora, który preprocesuje, aby odrzucić linie.

Odpowiedz

59

Właściwie to działa ładnie z filter:

import csv 
fp = open('samples.csv') 
rdr = csv.DictReader(filter(lambda row: row[0]!='#', fp)) 
for row in rdr: 
    print(row) 
fp.close() 
+15

To będzie przeczytać cały plik do pamięci. Jeśli nie jest zbyt duży, to nie ma problemu, w przeciwnym razie możesz użyć wyrażenia generatora lub 'itertools.ifilter()'. – Duncan

+29

... lub wyrażenie generatora: 'csv.DictReader (wiersz dla wiersza w fp, jeśli nie wiersz.startyz ('#'))' –

+0

@Duncan nie ma potrzeby itertools w Python3.6, jako 'filter() 'zwróci domyślnie iterator, dlatego plik nie zostanie załadowany do pamięci. –

Powiązane problemy