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

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

Ответ 1

В 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)

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

Ответ 2

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

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

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

Ответ 3

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

Скрипт с lineterminator НЕ является решением.

Ответ 4

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

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

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

Из документов Python:

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

Оригинал:

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

Ответ 5

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

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

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

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

ValueError: illegal newline value: ''

Таким образом, казалось, что они не согласны с отсутствием новой строки здесь.

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

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

и это помогло мне пропустить дополнительные строки новой строки.

Ответ 6

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

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

Ответ 7

with open(destPath+'\\'+csvXML, 'a+') as csvFile:
    writer = csv.writer(csvFile, delimiter=';', lineterminator='\r')
    writer.writerows(xmlList)

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

Ответ 8

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