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 в файл.
Импорт нескольких CSV-файлов в pandas и объединение в один DataFrame
'pip' не распознан как командa внутреннего или внешнего формата
Разделить строку по запятым, игнорируя запятые внутри двойных кавычек?
Python DictWriter: Запись UTF-8 закодированных CSV файлов
Сохранение результатов в CSV файл с помощью Python