В Python 2 откройте outfile
с режимом 'wb'
вместо 'w'
. csv.writer
записывает \r\n
в файл напрямую. Если вы не откроете файл в режиме binary , он напишет \r\r\n
, потому что в режиме Windows текст переводит каждый \n
в \r\n
.
В Python 3 был изменен требуемый синтаксис, поэтому откройте outfile
с дополнительным параметром newline=''
.
# Python 2
with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile:
writer = csv.writer(outfile)
# Python 3
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
writer = csv.writer(outfile)
Открытие файла в двоичном режиме «wb» не будет работать в Python 3+. Вернее, вам придется преобразовать свои данные в двоичные файлы, прежде чем писать. Это просто хлопот.
Вместо этого вы должны сохранить его в текстовом режиме, но переопределите новую строку как пустую. Например:
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
Я пишу этот ответ w.r.t. на python 3, поскольку у меня изначально была та же проблема.
Я должен был получить данные из arduino с помощью PySerial
и записать их в CSV-файле. Каждое чтение в моем случае заканчивалось на '\r\n'
, поэтому новая строка всегда разделяла каждую строку.
В моем случае опция newline=''
не работала. Потому что это показало некоторую ошибку, например:
with open('op.csv', 'a',newline=' ') as csv_file:
ValueError: illegal newline value: ''
Итак, казалось, что они не согласны с отсутствием новой строки здесь.
Увидев только один из ответов, я упомянул о терминаторе линии в объекте writer, например,
writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')
, и это работало для меня для пропуска дополнительных строк перевода строк.
Примечание. Кажется, это не предпочтительное решение из-за того, как добавлена дополнительная строка в системе Windows. Как указано в python documement :
Если csvfile является файловым объектом, он должен быть открыт с флагом 'b' на платформах, где это имеет значение.
Windows - одна из таких платформ, где это имеет значение. Хотя изменение ограничителя строк, как я описал ниже, возможно, устранил проблему, проблему можно было бы вообще избежать, открыв файл в двоичном режиме. Можно сказать, что это решение более «изящно». «Fiddling» с терминатором линии, вероятно, привел бы к неспортивному коду между системами в этом случае, когда открытие файла в двоичном режиме в системе unix не приводит к эффекту. то есть. это приводит к совместимому с перекрестной системой коду.
Из Документы Python :
В Windows, 'b', добавленный в режим, открывает файл в бинарный режим, поэтому существуют также такие режимы, как «rb», «wb» и «r + b». Python в Windows делает различие между текстовыми и двоичными файлами; конечные символы в текстовых файлах автоматически изменяются, когда данные считываются или записываются. Эта за кадром модификация файловых данных отлично подходит для текстовых файлов ASCII, но это приведет к повреждению двоичных данных, подобных этим в файлах JPEG или EXE. Будьте очень осторожны, чтобы использовать двоичный режим при чтении и записи таких файлов. В Unix не помешает добавить «b» в режим, поэтому вы можете использовать его независимо для всех двоичных файлов.
Оригинал:
Как часть необязательных параметров для csv.writer, если вы получаете лишние пустые строки, вам может потребоваться изменить определитель (info здесь ). Пример ниже адаптирован с страницы python csv docs. Измените его с '\n' на все, что должно быть. Поскольку это всего лишь удар в темноте при этой проблеме, это может работать или не работать, но это мое лучшее предположение.
>>> import csv >>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n') >>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans']) >>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
Простой ответ заключается в том, что файлы csv всегда должны открываться в двоичном режиме, будь то для ввода или вывода, поскольку в противном случае на Windows возникают проблемы с завершением строки. В частности, на выходе модуль csv будет писать \r\n
(стандартный разделитель строк CSV), а затем (в текстовом режиме) среда выполнения заменит \n
на \r\n
(стандартный терминатор линии Windows), давая результат \r\r\n
.
Скрипт с lineterminator
НЕ является решением.
io.open
с аргументомnewlines
. Если вы все еще пишете в 2.x, это похоже на лучший выбор, так как он совместим с переходом. – jpmc26 27 September 2017 в 18:49