Почему 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 автоматически укажет значение.)