Почему CSV файл содержит пустую строку между каждой линией данных при выводе с помощью Dictwriter в Python

Я использую DictWriter для вывода данных в словаре в файл csv. Почему у CSV файла есть пустая строка между каждой линией данных? Это не огромная сделка, но мой набор данных большой и не вписывается в один файл csv, поскольку он имеет слишком много строк, поскольку "двойной интервал" удваивает количество строк в файле.

Мой код для записи в словарь:

headers=['id', 'year', 'activity', 'lineitem', 'datum']
output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)
output.writerow(dict((fn,fn) for fn in headers))
for row in rows:
    output.writerow(row)

Ответ 1

По умолчанию классы в модуле csv используют терминаторы строк в стиле Windows (\r\n), а не Unix-style (\n). Может ли это быть причиной кажущихся разрывов двойной линии?

Если это так, вы можете переопределить его в конструкторе DictWriter:

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', lineterminator='\n', fieldnames=headers)

Ответ 2

Из http://docs.python.org/library/csv.html#csv.writer:

Если csvfile является файловым объектом, он должен быть открыт с помощью флага b где это имеет значение.

Другими словами, при открытии файла вы передаете 'wb' в отличие от 'w'.
Вы также можете использовать оператор with, чтобы закрыть файл, когда вы закончите запись на него.
Протестированный пример ниже:

from __future__ import with_statement # not necessary in newer versions
import csv
headers=['id', 'year', 'activity', 'lineitem', 'datum']
with open('file3.csv','wb') as fou: # note: 'wb' instead of 'w'
    output = csv.DictWriter(fou,delimiter=',',fieldnames=headers)
    output.writerow(dict((fn,fn) for fn in headers))
    output.writerows(rows)

Ответ 3

Изменение "w" (запись) в этой строке:

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)

В 'wb' (написать двоичный файл) исправил эту проблему для меня:

output = csv.DictWriter(open('file3.csv','wb'), delimiter=',', fieldnames=headers)

Python v2.75: Открыть()

Кредит @dandrejvv для решения в комментарии к исходному сообщению выше.

Ответ 4

Я только что протестировал ваш фрагмент, и здесь нет линии двойного интервала. Конечная строка \r\n, поэтому я бы проверил в вашем случае:

  • ваш редактор правильно читает файл DOS
  • no\n существует в значениях ваших строк dict.

(Обратите внимание, что даже поместив значение с \n, DictWriter автоматически укажет значение.)