You can parse the first line separately to find the separator and field names:
firstline = next(f).split() delimiter = firstline[1][-1] fields = firstline[2:]
Please note that csv.DictReader
can take any iterative value as the first argument. Therefore, to skip comments, you can wrap f
in an iterator ( skip_comments
), which gives only lines without comments:
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
The data you enter gives
{'field2': 'b', 'field3': 'c', 'field1': 'a'} {'field2': 'e', 'field3': 'f', 'field1': 'd'} {'field2': 'h', 'field3': 'i', 'field1': 'g'}
To write a file in this format, you can use the header
helper function:
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')
Note that you can write output.csv
using g.write
(for title lines or comments) or writer.writerow
(for csv).