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



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

501   6  

6 ответов:

в Python 2 Откройте outfile в режиме 'wb' вместо 'w'. Элемент csv.writer пишет \r\n непосредственно в файл. Если вы не откроете файл в binary режим, он будет писать \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. Как указано в python documement:

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

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

С Python Docs:

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

Оригинал:

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

Я пишу этот ответ Вт.Р.Т. в Python 3, Как я первоначально получил ту же проблему.

Я должен был получить данные от arduino с помощью PySerial, и запишите их в a .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')

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

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

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

Comments

    Ничего не найдено.