Изменить:
в 2.7 / 3.2 есть новый writeheader()
метод . Кроме того, ответ Джона Мачина предоставляет более простой метод записи строки заголовка.
Простой пример использования writeheader()
метода, теперь доступного в 2.7 / 3.2:
from collections import OrderedDict
ordered_fieldnames = OrderedDict([('field1',None),('field2',None)])
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=ordered_fieldnames)
dw.writeheader()
# continue on to write data
Для создания экземпляра DictWriter требуется аргумент fieldnames.
Из документации :
Параметр fieldnames определяет порядок, в котором значения в словаре, переданном методу writerow (), записываются в csvfile.
Другими словами: аргумент Fieldnames является обязательным, потому что диктовки Python по своей сути неупорядочены.
Ниже приведен пример записи заголовка и данных в файл.
Примечание: with
оператор был добавлен в 2.6. При использовании 2.5:from __future__ import with_statement
with open(infile,'rb') as fin:
dr = csv.DictReader(fin, delimiter='\t')
# dr.fieldnames contains values from first row of `f`.
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
headers = {}
for n in dw.fieldnames:
headers[n] = n
dw.writerow(headers)
for row in dr:
dw.writerow(row)
Как @FM упоминает в комментарии, вы можете сжать заголовок до однострочного, например:
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
dw.writerow(dict((fn,fn) for fn in dr.fieldnames))
for row in dr:
dw.writerow(row)
dw.writerow( dict((f,f) for f in dr.fieldnames) )
.dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
. Таким образом, если ваши поля изменяются, вам не нужно настраивать dictWriter.Несколько вариантов:
(1) Кропотливо сделайте отображение идентификаторов (т.е. ничего не делайте) из ваших имен полей, чтобы csv.DictWriter мог преобразовать его обратно в список и передать его экземпляру csv.writer.
(2) В документации упоминается «базовый
writer
экземпляр» ... так что просто используйте его (пример в конце).(3) Избегайте накладных расходов csv.Dictwriter и сделайте это самостоятельно с помощью csv.writer
Запись данных:
или
Вместо
extrasaction
«функциональности» я бы предпочел сам кодировать; таким образом вы можете сообщить обо ВСЕХ «дополнительных» ключах и значениях, а не только о первом дополнительном ключе. Что действительно неприятно с DictWriter, так это то, что если вы сами проверяли ключи при создании каждого dict, вам нужно не забыть использовать extrasaction = 'ignore', иначе он будет МЕДЛЕННО (имена полей - это список) повторить проверку:============
источник
extrasaction
функциональность, похоже, реализована лучше. Теперь всеwrong_fields = rowdict.keys() - self.fieldnames so it's effectively a
готово.Другой способ сделать это - добавить перед добавлением строк в ваш вывод следующую строку:
Почтовый индекс вернет список дублетов, содержащих то же значение. Этот список можно использовать для запуска словаря.
источник