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.
Ответы:
Python 3:
newline=''
newline='\n'
Python 2:
В Windows всегда открывайте файлы в двоичном режиме (
"rb"
или"wb"
), прежде чем передавать их вcsv.reader
илиcsv.writer
.Хотя файл представляет собой текстовый файл, участвующие библиотеки рассматривают CSV как двоичный формат с
\r\n
разделением записей. Если разделитель записывается в текстовом режиме, среда выполнения Python заменяет\n
с\r\n
, следовательно,\r\r\n
наблюдается в файле.Смотрите этот предыдущий ответ .
источник
open(..., "w", newline="\n", encoding="utf-8")
.newline
также может быть пустой строкой, тот же результат."wb"
не работает в Python 3, строки и интерфейс буфера несовместимы.writer = csv.writer(f, lineterminator='\n')
Хотя @ john-machin дает хороший ответ, это не всегда лучший подход. Например, он не работает на Python 3, если вы не закодируете все свои входные данные в CSV-писатель. Кроме того, это не решает проблему, если скрипт хочет использовать sys.stdout в качестве потока.
Вместо этого я предлагаю установить атрибут lineterminator при создании писателя:
Этот пример будет работать на Python 2 и Python 3 и не будет создавать нежелательных символов новой строки. Обратите внимание, однако, что это может привести к нежелательным символам новой строки (без символа LF в операционных системах Unix).
Однако в большинстве случаев я считаю, что поведение предпочтительнее и естественнее, чем обработка всего CSV как двоичного формата. Я предоставляю этот ответ в качестве альтернативы для вашего рассмотрения.
источник
\r
больше не избежать! Похоже, что это ошибкаcsvwriter
, но на самом деле вывод несовместимого CSV означает, что это не тот путь.^M
проблему для меня, в то время как принятый ответ 2 предложения не работал.В Python 3 (я не пробовал это в Python 2), вы также можете просто сделать
в соответствии с документацией .
Подробнее об этом в сноске документа :
источник
Вы можете ввести параметр lineterminator = '\ n' в команде csv writer.
источник
lineterminator='\n'
); модуль CSV, казалось, был источником\r\n
. Никакой набор аргументов неopen
имел никакого эффекта.Я не уверен точно, почему это происходит, но изменение режима файла с "w" на "wb" исправляет это. Смотрите мой ответ на " как удалить ^ M " для более подробной информации.
источник
Вы должны добавить атрибут newline = "\ n", чтобы открыть функцию следующим образом:
источник
Обратите внимание, что если вы используете DictWriter, у вас будет новая строка из функции open и новая строка из функции writerow. Вы можете использовать newline = '' внутри функции open, чтобы удалить лишнюю новую строку.
источник