Файл CSV, написанный на Python, имеет пустые строки между каждой строкой

import csv with open('thefile.csv', 'rb') as f: data = list(csv.reader(f)) import collections counter = collections.defaultdict(int) for row in data: counter[row[10]] += 1 with open('/pythonwork/thefile_subset11.csv', 'w') as outfile: writer = csv.writer(outfile) for row in data: if counter[row[10]] >= 504: writer.writerow(row) 

Этот код считывает thefile.csv , вносит изменения и записывает результаты в thefile_subset1 .

Однако, когда я открываю результирующий csv в Microsoft Excel, после каждой записи появляется дополнительная пустая строка!

Есть ли способ сделать это не лишней пустой линией?

4 Solutions collect form web for “Файл CSV, написанный на Python, имеет пустые строки между каждой строкой”

В Python 2 откройте outfile с режимом 'wb' вместо 'w' . csv.writer записывает \r\n в файл напрямую. Если вы не откроете файл в двоичном режиме, он напишет \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: 

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

Включение с помощью lineterminator не является решением.

Примечание. Кажется, это не предпочтительное решение из-за того, как добавлена ​​дополнительная строка в системе Windows. Как указано в документации python :

Если csvfile является файловым объектом, он должен быть открыт с флагом 'b' на платформах, где это имеет значение.

Windows – одна из таких платформ, где это имеет значение. Хотя изменение ограничителя строк, как я описал ниже, возможно, устранил проблему, проблему можно было бы вообще избежать, открыв файл в двоичном режиме. Можно сказать, что это решение более «изящно». «Fiddling» с терминатором линии, вероятно, привел бы к неспортивному коду между системами в этом случае, когда открытие файла в двоичном режиме в системе unix не приводит к эффекту. то есть. это приводит к совместимости кода, совместимого с системой.

Из документов Python :

В Windows «b», добавленный в режим, открывает файл в двоичном режиме, поэтому существуют также такие режимы, как «rb», «wb» и «r + b». Python в Windows делает различие между текстовыми и двоичными файлами; конечные символы в текстовых файлах автоматически изменяются, когда данные считываются или записываются. Эта за кадром модификация файловых данных отлично подходит для текстовых файлов ASCII, но это приведет к повреждению двоичных данных, подобных этим в файлах JPEG или EXE. Будьте очень осторожны, чтобы использовать двоичный режим при чтении и записи таких файлов. В Unix не помешает добавить «b» в режим, поэтому вы можете использовать его платформу независимо для всех двоичных файлов.

Оригинал :

Как часть необязательных параметров для csv.writer, если вы получаете дополнительные пустые строки, вам может потребоваться изменить определитель (info here ). Пример ниже адаптирован из страницы 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']) 
  • загрузить внешние библиотеки внутри кода pyspark
  • Loop for Parsing complex tab с разделителями / csv в Python
  • не удалось загрузить простой csv в networkx в Python
  • Ошибка в python, csv и mysql: Ошибка: 1054 (42S22): Неизвестный столб 'nan' в 'списке полей'
  • Почему pandas read_csv не читает правильное количество строк?
  • Сохранение результатов в файл csv с помощью Python
  • нет атрибута с именем read_csv в pandas python
  • Импорт csv-файла в матрицу / массив в Python
  • Python - лучший язык программирования в мире.