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

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, после каждой записи появляется дополнительная пустая строка!

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

6 ответов


в Python 2 Откройте outfile в режиме 'wb' вместо 'w'. The 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)

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


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

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

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

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

возился с lineterminator это не решение.


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

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

Windows-одна из таких платформ, где это имеет значение. При изменении Терминатора линии, как я описал ниже, возможно, Исправлена проблема, проблемы можно избежать, открыв файл в двоичном режиме. Можно сказать, что это решение более "элегантное". "Возня" с Терминатором линии, вероятно, привела бы к непортящемуся коду между системами в этом случае, где открытие файла в двоичном режиме в системе unix не приводит к эффекту. то есть. это приводит к кросс-совместимому коду системы.

С Python Docs:

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

Оригинал:

как часть дополнительных параметров для csv.writer если вы получаете дополнительные пустые строки, вам может потребоваться изменить lineterminator (info здесь). Пример ниже адаптирован со страницы python документы csv. измените его с '\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'])

Я пишу этот ответ w.r.т. к python 3, так как у меня изначально была такая же проблема.

Я должен был получить данные от Arduino, используя PySerial, и запишите их в a .CSV-файл. Каждое чтение в моем случае заканчивалось '\r\n', поэтому новая строка всегда отделяла каждую строку.

в моем случае, newline='' опция не работает. Потому что он показал некоторую ошибку, как:

with open('op.csv', 'a',newline=' ') as csv_file:

ValueError: illegal newline value: ''

таким образом, казалось, что они не принимают упущение newline здесь.

видя один из ответов только здесь я упомянул line terminator в объекте writer, например,

writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')

и это сработало для меня, чтобы пропустить дополнительные новые строки.


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

with codecs.open( csv_file,  mode='w', encoding='utf-8') as out_csv:
     csv_out_file = csv.DictWriter(out_csv)