Как я могу остановить csv Python?Диктатор.writerows от добавления пустых строк между строками в Windows при использовании stdout?
Когда я запускаю этот код в Eclipse с помощью PyDev, я вижу вывод с пустыми строками между строками. Как я могу от них избавиться? Это происходит только с помощью python3.
import csv
import sys
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(sys.stdout, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
Вывод В Eclipse
First_name, last_name
Запеченные Бобы
Прекрасный, Спам
Замечательно, Спам
Вывод корректен в cygwin-bash, на Linux и некорректен при использовании перенаправления на файл в cmd.exe + Windows python (окно консоли, по-видимому правильно)
1 ответ:
Из документации довольно ясно, что CSV-модуль должен иметь контроль над новыми строками; в Python 2 предполагается, что вы откроете объект file в двоичном режиме, в Python 3 вам нужно установить опцию
newline
в''
. Смотрите Как я могу остановить csv Python.Диктатор.writerows от добавления пустых строк между строками в Windows?Это потому, что модуль по умолчанию записывает в файл разделители строк
\r\n
. Обработка текстового режима windows затем заменяет\n
на\r\n
и вы видите, что появляются пустые строки, потому что теперь строки разделены\r\r\n
.Вы можете установить
lineterminator
аргумент к'\n'
для изменения того, что модуль использует для разделения строк:writer = csv.DictWriter(sys.stdout, fieldnames=fieldnames, lineterminator='\n')
Демо:
>>> import csv >>> from StringIO import StringIO >>> fieldnames = ['first_name', 'last_name'] >>> out = StringIO() >>> writer = csv.DictWriter(out, fieldnames=fieldnames) >>> writer.writeheader() >>> out.getvalue() 'first_name,last_name\r\n' >>> out = StringIO() >>> writer = csv.DictWriter(out, fieldnames=fieldnames, lineterminator='\n') >>> writer.writeheader() >>> out.getvalue() 'first_name,last_name\n'
sys.stdout
все равно переведу это\n
на\r\n
, но теперь нет\r
, предшествующего ему.