CSV-файл, написанный на Python, содержит пустые строки между каждой строкой - PullRequest
341 голосов
/ 28 июля 2010
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, после каждого появляется дополнительная пустая строказапись!

Есть ли способ сделать так, чтобы в нем не было лишней пустой строки?

Ответы [ 8 ]

693 голосов
/ 28 июля 2010

В Python 2 откройте outfile в режиме 'wb' вместо 'w'.csv.writer записывает \r\n в файл напрямую.Если вы не откроете файл в режиме двоичный , он напишет \r\r\n, потому что в Windows текстовый режим переведет каждый \n в \r\n.

В Python 3 изменился необходимый синтаксис, поэтому откройте outfile с дополнительным параметром newline=''.

Примеры:

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

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

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

41 голосов
/ 16 февраля 2014

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

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

with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
12 голосов
/ 28 июля 2010

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

Неважно играть с lineterminator.

6 голосов
/ 28 июля 2010

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

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

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

Из Python Docs :

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

Оригинал :

Как часть необязательных параметров для csv.writer, если вы получаете дополнительные пустые строки, вам, возможно, придется изменить терминатор строки (информация здесь ).Приведенный ниже пример адаптирован со страницы 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'])
4 голосов
/ 03 ноября 2017

Я пишу этот ответ в 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 голосов
/ 19 апреля 2019
with open(destPath+'\\'+csvXML, 'a+') as csvFile:
    writer = csv.writer(csvFile, delimiter=';', lineterminator='\r')
    writer.writerows(xmlList)

"lineterminator = '\ r'" позволяет перейти к следующей строке без пустой строки между двумя.

0 голосов
/ 02 декабря 2018

Используйте метод, определенный ниже, чтобы записать данные в файл CSV.

open('outputFile.csv', 'a',newline='')

Просто добавьте дополнительный параметр 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 голосов
/ 24 августа 2018

При использовании Python 3 пустых строк можно избежать с помощью модуля codecs . Как указано в документации, файлы открываются в двоичном режиме, поэтому никаких изменений новой строки kwarg не требуется. Недавно я столкнулся с той же проблемой, и это сработало для меня:

with codecs.open( csv_file,  mode='w', encoding='utf-8') as out_csv:
     csv_out_file = csv.DictWriter(out_csv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...