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)