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

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

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

Примечание:

  • Это поведение может произойти с Python 2 или 3.
202
задан Trenton McKinney 18 September 2019 в 07:42
поделиться

2 ответа

Python 3:

  • Как описано YiboYang, установите newline=''
with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    ...
  • Как отмечено в комментариях CoDEmanX, установите newline='\n'
with open('output.csv', 'w', newline='\n', encoding='utf-8') as f:
    writer = csv.writer(f)
    ...

Python 2:

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

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

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

269
ответ дан 23 November 2019 в 04:58
поделиться

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

4
ответ дан 23 November 2019 в 04:58
поделиться
Другие вопросы по тегам:

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