7

CSV-файл, созданный с помощью Python, содержит пустые строки между каждой записью

2

У меня есть следующий код на 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 ответ(ов)

0

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

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

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

Это позволит вам корректно работать с текстовыми данными, избегая лишних преобразований.

0

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

Попытки изменить lineterminator — это НЕ решение.

0

Чтобы использовать метод, определённый ниже, для записи данных в 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 файл без создания лишних пустых строк!

0

Я пишу этот ответ с учетом 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')

И это сработало для меня, позволяя избежать лишних переносов строк.

0

В вашем коде вы используете 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 в файл.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь