Można analizować pierwszą linię osobno znaleźć separatora i fieldnames:
firstline = next(f).split()
delimiter = firstline[1][-1]
fields = firstline[2:]
Zauważ, że csv.DictReader
zniosę iterable jako pierwszy argument. Tak aby pominąć komentarze, można owinąć f
w iterator (skip_comments
) co daje tylko linie bez komentarza:
import csv
def skip_comments(iterable):
for line in iterable:
if not line.startswith('#'):
yield line
with open('data.csv','rb') as f:
firstline = next(f).split()
delimiter = firstline[1][-1]
fields = firstline[2:]
for line in csv.DictReader(skip_comments(f),
delimiter = delimiter, fieldnames = fields):
print line
Z danych, które pisał ten daje
{'field2': 'b', 'field3': 'c', 'field1': 'a'}
{'field2': 'e', 'field3': 'f', 'field1': 'd'}
{'field2': 'h', 'field3': 'i', 'field1': 'g'}
Aby napisać plik w tym formacie, można użyć funkcji pomocniczej header
:
def header(delimiter,fields):
return '#h -F{d} {f}\n'.format(d = delimiter, f=' '.join(fields))
with open('data.csv', 'rb') as f:
with open('output.csv', 'wb') as g:
firstline = next(f).split()
delimiter = firstline[1][-1]
fields = firstline[2:]
writer = csv.DictWriter(g, delimiter = delimiter, fieldnames = fields)
g.write(header(delimiter,fields))
for row in csv.DictReader(skip_comments(f),
delimiter = delimiter, fieldnames = fields):
writer.writerow(row)
g.write('# comment\n')
Zauważ, że możesz napisać do output.csv
używając g.write
(dla linii nagłówka lub komentarza) lub writer.writerow
(dla csv).
Czy próbowałeś podklasować istniejące klasy i dodać dodatkowe zachowanie? – IanGilham
tylko część komentarza: http://stackoverflow.com/questions/14158868/python-skip-comment-lines-marked-with-in-csv-dictreader –