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'. Элемент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), а затем (в текстовом режиме) среда выполнения заменит\nby\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