Как я могу остановить 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, предшествующего ему.