Вопрос-Ответ

CSV file written with Python has blank lines between each row

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, после каждой записи появляется дополнительная пустая строка!

Есть ли способ заставить его не помещать лишнюю пустую строку?

Переведено автоматически
Ответ 1

csv.writer Модуль напрямую управляет окончаниями строк и выполняет запись \r\n непосредственно в файл. В Python 3 файл должен быть открыт в непереведенном текстовом режиме с параметрами 'w', newline='' (пустая строка), иначе он будет записан \r\r\n в Windows, где текстовый режим по умолчанию переведет каждый из них \n в \r\n.

#!python3
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
writer = csv.writer(outfile)

При использовании Path модуля:

from pathlib import Path
import csv

with Path('/pythonwork/thefile_subset11.csv').open('w', newline='') as outfile:
writer = csv.writer(outfile)

При использовании StringIO модуля для создания результата в памяти результирующая строка будет содержать переведенный символ завершения строки:

from io import StringIO
import csv

s = StringIO()
writer = csv.writer(s)
writer.writerow([1,2,3])
print(repr(s.getvalue())) # '1,2,3\r\n' (Windows result)

При последующей записи этой строки в файл не забудьте использовать newline='':

# built-in open()
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as f:
f.write(s.getvalue())

# Path's open()
with Path('/pythonwork/thefile_subset11.csv').open('w', newline='') as f:
f.write(s.getvalue())

# Path's write_text() added the newline parameter to Python 3.10.
Path('/pythonwork/thefile_subset11.csv').write_text(s.getvalue(), newline='')

В Python 2 используйте двоичный режим для открытия outfile с помощью mode 'wb' вместо 'w' для предотвращения перевода новой строки Windows. В Python 2 также есть проблемы с Unicode и требуются другие обходные пути для записи текста, отличного от ASCII. Смотрите ссылку на Python 2 ниже и UnicodeReader и UnicodeWriter примеры в конце страницы, если вам приходится иметь дело с записью строк Unicode в CSV на Python 2, или загляните в модуль unicodecsv сторонних производителей:

#!python2
with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile:
writer = csv.writer(outfile)

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

Ответ 2

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

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

with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
Ответ 3

Многие другие ответы устарели за десять лет, прошедших с момента первоначального вопроса. Для Python3 правильный ответ содержится в документации:


Если csvfile является файловым объектом, его следует открыть с помощью newline=''


В сноске объясняется более подробно:


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


Ответ 4

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


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


Windows - одна из таких платформ, где это имеет значение. Хотя изменение символа окончания строки, как я описал ниже, могло устранить проблему, проблемы можно было бы вообще избежать, открыв файл в двоичном режиме. Можно сказать, что это решение более "элегантное". "Манипулирование" с ограничителем строки, вероятно, привело бы к непереносимости кода между системами в этом случае, когда открытие файла в двоичном режиме в системе Unix не приводит ни к какому эффекту. т. е. Это приводит к межсистемному совместимому коду.

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


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


Оригинал:

Как часть дополнительных параметров для csv.writer, если вы получаете дополнительные пустые строки, вам, возможно, придется изменить lineterminator (информация здесь). Приведенный ниже пример адаптирован со страницы 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'])
2023-08-19 03:33 python windows csv