CSV в Python добавляет дополнительный возврат каретки в Windows

В Python 2.7, работающем под Windows XP pro:

import csv
outfile = file('test.csv', 'w')
writer = csv.writer(outfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['hi','dude'])
writer.writerow(['hi2','dude2'])
outfile.close()

Он генерирует файл test.csv с дополнительным \r в каждой строке, например:

test.csv

hi,dude\r\r\nhi2,dude2\r\r\n

вместо ожидаемого:

hi,dude\r\nhi2,dude2\r\n

Почему это происходит, или это действительно желаемое поведение?

164
07 июля '10 в 5:34
источник поделиться
7 ответов

В Windows всегда открывайте файлы в двоичном режиме ("rb" или "wb"), прежде чем передавать их в csv.reader или csv.writer.

Хотя файл представляет собой текстовый файл, участвующие библиотеки рассматривают CSV как двоичный формат с разделением записей "\ r\n". Если этот разделитель написан в текстовом режиме, среда выполнения Python заменяет "\n" на "\ r\n", следовательно, "\ r\r\n", который вы наблюдали в вашем файле.

Смотрите этот предыдущий ответ.


Этот ответ был опубликован в 2010 году и не решает проблему в Python3.

Одним из возможных исправлений в Python3, как описано в ответе @YiboYang, является открытие файла с параметром newline задана пустая строка:

f = open(path_to_file, 'w', newline='')
writer = csv.writer(f)
...
...
212
07 июля '10 в 6:57
источник

Связанные вопросы


Похожие вопросы

Хотя @john-machin дает хороший ответ, это не всегда лучший подход. Например, он не работает на Python 3, если вы не кодируете все ваши входы в CSV-записи. Кроме того, он не решает проблему, если скрипт хочет использовать sys.stdout в качестве потока.

Я предлагаю вместо этого установить атрибут "lineterminator" при создании записи:

import csv
import sys

doc = csv.writer(sys.stdout, lineterminator='\n')
doc.writerow('abc')
doc.writerow(range(3))

Этот пример будет работать на Python 2 и Python 3 и не будет создавать нежелательные символы новой строки. Обратите внимание, однако, что это может привести к нежелательным переводам строк (исключая символ LF в операционных системах Unix).

Однако в большинстве случаев я считаю, что поведение предпочтительнее и естественнее, чем обработка всего CSV как двоичного формата. Я предоставляю этот ответ в качестве альтернативы вашему рассмотрению.

213
18 июля '13 в 16:59
источник

В Python 3 (я не пробовал это в Python 2), вы также можете просто сделать

with open('output.csv','w',newline='') as f:
    writer=csv.writer(f)
    writer.writerow(mystuff)
    ...

согласно документации.

Подробнее об этом в документе сноска:

Если newline = '' не указывается, новые строки, встроенные в поля, указанные в кавычках не будут правильно интерпретироваться и на платформах, которые используют \r\n будут добавлены вклады для записи дополнительного \r. Это всегда должно быть безопасно указывать newline = '', так как модуль csv делает свои собственные (универсальная) обработка новой строки.

46
18 марта '15 в 10:43
источник

Я точно не знаю, почему это происходит, но изменение вашего файлового режима с "w" на "wb" исправляет его. Для получения более подробной информации см. Мой ответ на как удалить ^ M".

4
07 июля '10 в 5:49
источник

Вам нужно добавить атрибут newline = "\n", чтобы открыть такую ​​функцию:

with open('file.csv','w',newline="\n") as out:
    csv_out = csv.writer(out, delimiter =';')
3
01 июня '17 в 23:41
источник

Обратите внимание, что если вы используете DictWriter, у вас будет новая строка из функции open и новая строка из функции writow. Вы можете использовать newline = '' внутри функции open, чтобы удалить дополнительную строку новой строки.

1
24 окт. '17 в 0:39
источник

Вы можете ввести параметр lineterminator = '\n' в команде csv writer.

import csv
delimiter='\t'
with open('tmp.csv', '+w', encoding='utf-8') as stream:
    writer = csv.writer(stream, delimiter=delimiter, quoting=csv.QUOTE_NONE, quotechar='',  lineterminator='\n')
    writer.writerow(['A1' , 'B1', 'C1'])
    writer.writerow(['A2' , 'B2', 'C2'])
    writer.writerow(['A3' , 'B3', 'C3'])
1
09 окт. '17 в 13:21
источник

Посмотрите другие вопросы по меткам или Задайте вопрос