CSV file written with Python has blank lines between each row
CSV-файл, написанный с помощью Python, содержит пустые строки между каждой строкой
import csv
withopen('thefile.csv', 'rb') as f: data = list(csv.reader(f)) import collections counter = collections.defaultdict(int)
for row in data: counter[row[10]] += 1
withopen('/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 withopen('/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 модуля для создания результата в памяти результирующая строка будет содержать переведенный символ завершения строки:
При последующей записи этой строки в файл не забудьте использовать newline='':
# built-in open() withopen('/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 withopen('/pythonwork/thefile_subset11.csv', 'wb') as outfile: writer = csv.writer(outfile)
Открытие файла в двоичном режиме "wb" не будет работать в Python 3+. Или, скорее, вам придется преобразовать ваши данные в двоичный формат перед их записью. Это просто проблема.
Вместо этого вы должны сохранить его в текстовом режиме, но переопределить перевод строки как пустой. Вот так:
withopen('/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 не приводит ни к какому эффекту. т. е. Это приводит к межсистемному совместимому коду.
В Windows 'b', добавленный к режиму, открывает файл в двоичном режиме, поэтому существуют также такие режимы, как 'rb', 'wb' и 'r + b'. Python в Windows проводит различие между текстовыми и двоичными файлами; символы в конце строки в текстовых файлах автоматически слегка изменяются при чтении или записи данных. Это скрытое изменение данных файла подходит для текстовых файлов ASCII, но оно приведет к повреждению двоичных данных, подобных тем, что в файлах JPEG или EXE. Будьте очень осторожны при использовании двоичного режима при чтении и записи таких файлов. В Unix не помешает добавить 'b' к режиму, так что вы можете использовать его независимо от платформы для всех двоичных файлов.
Оригинал:
Как часть дополнительных параметров для csv.writer, если вы получаете дополнительные пустые строки, вам, возможно, придется изменить lineterminator (информация здесь). Приведенный ниже пример адаптирован со страницы python csv docs. Измените значение '\n' на то, каким оно должно быть. Поскольку это всего лишь попытка разобраться в проблеме, это может сработать, а может и не сработать, но это мое лучшее предположение.