Python, csv.writer сделал пустой список каждой итерации [duplicate]

Новый метод:

this.scrollIntoView(false);
245
задан davidism 28 March 2016 в 22:34
поделиться

6 ответов

В 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)

Ссылки на документацию

449
ответ дан Mark Tolonen 19 August 2018 в 15:13
поделиться
  • 1
    В любом случае ответ @Mark Tolonen разрешил много вопросов, связанных с добавленной строкой, добавленной при сохранении текстового файла стандарта (без использования csv). – dlewin 24 September 2015 в 09:32
  • 2
    @Mark Tolonen: Это помогло мне через 7 лет! Большое спасибо! – Razort4x 12 June 2017 в 14:24
  • 3
    Хороший отзыв, спас мне много хлопот. – Helen Neely 25 August 2017 в 10:23
  • 4
    Спасибо. Это очень полезно и очень легко. – Edip Ahmet 4 September 2017 в 00:10
  • 5
    Для совместимости между 2.6 / 2.7 и 3 вы можете использовать io.open с аргументом newlines. Если вы все еще пишете в 2.x, это похоже на лучший выбор, так как он совместим с переходом. – jpmc26 27 September 2017 в 18:49
  • 6
    – Mark Tolonen 26 February 2018 в 23:26

Открытие файла в двоичном режиме «wb» не будет работать в Python 3+. Вернее, вам придется преобразовать свои данные в двоичные файлы, прежде чем писать. Это просто хлопот.

Вместо этого вы должны сохранить его в текстовом режиме, но переопределите новую строку как пустую. Например:

with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
33
ответ дан David Maddox 19 August 2018 в 15:13
поделиться

Я пишу этот ответ 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')

, и это работало для меня для пропуска дополнительных строк перевода строк.

2
ответ дан Debanjan Dey 19 August 2018 в 15:13
поделиться

Примечание. Кажется, это не предпочтительное решение из-за того, как добавлена ​​дополнительная строка в системе 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'])
4
ответ дан Derek Litz 19 August 2018 в 15:13
поделиться
  • 1
    Я собирался опубликовать об этом - lineterminator = '\n' работал для меня в простом тесте. – Dan Breslau 27 July 2010 в 23:39
  • 2
    я могу это сделать & gt; с открытым ('/ pythonwork / thefile_subset11.csv', 'w'), lineterminator = '\n' как outfile: – l--''''''---------'''''''''''' 27 July 2010 в 23:41
  • 3
    @I__: Вы действительно должны начать просматривать документы Python. Дерек дал вам ссылку: docs.python.org/library/csv.html – Dan Breslau 27 July 2010 в 23:49
  • 4
    -1 "в темном" == & quot; неправильный & quot; – John Machin 28 July 2010 в 00:15
  • 5
    dan breslau, это имя является браслевым изначально правильно? ваши предки - откуда беларусия или украина? – l--''''''---------'''''''''''' 28 July 2010 в 01:20

Простой ответ заключается в том, что файлы csv всегда должны открываться в двоичном режиме, будь то для ввода или вывода, поскольку в противном случае на Windows возникают проблемы с завершением строки. В частности, на выходе модуль csv будет писать \r\n (стандартный разделитель строк CSV), а затем (в текстовом режиме) среда выполнения заменит \n на \r\n (стандартный терминатор линии Windows), давая результат \r\r\n.

Скрипт с lineterminator НЕ является решением.

11
ответ дан John Machin 19 August 2018 в 15:13
поделиться
  • 1
    Что такое CSV "стандарт" о котором вы говорите? – Dan Breslau 28 July 2010 в 00:30
  • 2
    @Dan: Я использовал "стандартный" как прилагательное, а не существительное, означающее «обычный». или "обычное". Если вы хотите приблизиться к стандарту (существительному), прочитайте tools.ietf.org/html/rfc4180 – John Machin 28 July 2010 в 01:26
  • 3
    Точка (как вы подразумеваете), что нет стандарта. Это RFE является информационным. Хотя\r\n может быть "стандартным" в Windows я уверен, что приложения Unix обычно не видят этого. – Dan Breslau 28 July 2010 в 03:51
  • 4
    @Dan: Это правильно - нет стандарта. В сценариях должен указываться определитель [должен был быть назван ROWterminator], который они хотят (если не по умолчанию), и все еще используют двоичный режим в случае, если сценарий запущен в Windows, в противном случае «определитель имен» могут быть набиты. – John Machin 28 July 2010 в 04:28
0
ответ дан anothernode 31 October 2018 в 02:32
поделиться
Другие вопросы по тегам:

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