CSV-файл, созданный с помощью Python, содержит пустые строки между каждой записью
У меня есть следующий код на Python, который читает файл CSV, обрабатывает данные и записывает результаты в новый файл:
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_subset11.csv
.
Однако, когда я открываю результирующий CSV-файл в Microsoft Excel, после каждой записи появляется лишняя пустая строка!
Есть ли способ сделать так, чтобы не добавлялась лишняя пустая строка?
5 ответ(ов)
Открытие файла в бинарном режиме "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
— это НЕ решение.
Чтобы использовать метод, определённый ниже, для записи данных в CSV файл, просто добавьте дополнительный параметр newline=''
в функцию open
:
def writePhoneSpecsToCSV():
rowData = ["field1", "field2"]
with open('outputFile.csv', 'a', newline='') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(rowData)
Этот код будет записывать строки в CSV файл без создания лишних пустых строк!
Я пишу этот ответ с учетом Python 3, так как изначально столкнулся с аналогичной проблемой.
Мне нужно было получать данные с Arduino с помощью PySerial
и записывать их в файл .csv. В моем случае каждое чтение заканчивалось на '\r\n'
, поэтому новая строка всегда отделяла каждую запись.
Опция newline=''
в моем случае не сработала, так как возникла ошибка:
with open('op.csv', 'a', newline=' ') as csv_file:
ValueError: illegal newline value: ''
Похоже, что здесь не принимается отсутствие указания символа новой строки.
В одном из ответов я увидел, что можно указать разделитель строк в объекте записи, таким образом:
writer = csv.writer(csv_file, delimiter=' ', lineterminator='\r')
И это сработало для меня, позволяя избежать лишних переносов строк.
В вашем коде вы используете lineterminator='\r'
для того, чтобы не создавать пустую строку между записями в CSV-файле. Это связано с тем, что по умолчанию Python добавляет символ новой строки (\n
) в конце каждой строки, что может привести к тому, что между записями будет вставляться пустая строка при использовании некоторых приложений. Указав lineterminator='\r'
, вы гарантируете, что новые записи будут записываться последовательно без дополнительных пустых строк.
Вот ваш код с пояснением:
with open(destPath + '\\' + csvXML, 'a+') as csvFile:
writer = csv.writer(csvFile, delimiter=';', lineterminator='\r')
writer.writerows(xmlList)
Здесь csv.writer
создает объект writer
, который записывает строки из xmlList
в файл. Параметр delimiter=';'
указывает, что в качестве разделителя будет использоваться точка с запятой. Использование a+
в методе open
позволяет открывать файл для чтения и записи (при этом файл будет создан, если он не существует), а writer.writerows
записывает все строки из xmlList
в файл.
Запись DataFrame pandas в CSV файл
Как избежать создания индекса при сохранении DataFrame в CSV с помощью pandas
Ошибка UnicodeDecodeError при чтении CSV-файла в Pandas
pandas.parser.CParserError: Ошибка при токенизации данных
Импорт нескольких CSV-файлов в pandas и объединение в один DataFrame