Как я могу остановить 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 (окно консоли, по-видимому правильно)

Вывод из cmd.exe перенаправляется в файл, просматриваемый в Notepad++

1 2

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, предшествующего ему.