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, после каждой записи появляется дополнительная пустая строка!
Есть ли способ заставить его не ставить лишнюю пустую строку?
Ответы:
В Python 2 откройте
outfile
режим'wb'
вместо'w'
.csv.writer
Пишет\r\n
в файл напрямую. Если вы не откроете файл в двоичном режиме, он напишет,\r\r\n
потому что в Windows текстовый режим переведет каждый\n
в\r\n
.В Python 3 изменился необходимый синтаксис (см. Ссылки на документацию ниже), поэтому откройте его
outfile
с помощью дополнительного параметраnewline=''
(пустая строка).Примеры:
Документация Ссылки
источник
io.open
сnewlines
аргументом. Если вы все еще пишете в 2.x, это все равно кажется лучшим выбором, так как он совместим с форвардом.io.open
. Существуетunicodecsv
сторонний модуль для Python 2.7, который работает лучше.newline=''
трюк не работает в python3 со StringIO или TemporaryFile?StringIO
буферизует те же самые кодовые точки, которые будут закодированы в файл, иTemporaryFile
поддерживаетnewline
параметр, поэтому его можно открыть как сopen
. Задайте вопрос с примером программы, которая не работает.Открытие файла в двоичном режиме «wb» не будет работать в Python 3+. Или, скорее, вам придется преобразовать ваши данные в двоичный файл перед записью. Это просто хлопот.
Вместо этого вы должны оставить его в текстовом режиме, но переопределить новую строку как пустую. Вот так:
источник
Простой ответ заключается в том, что CSV-файлы всегда следует открывать в двоичном режиме для ввода или вывода, так как в противном случае в Windows возникают проблемы с окончанием строки. Конкретно на выходе модуль CSV будет написать
\r\n
(стандартный CSV строки терминатор) , а затем (в текстовом режиме) среда выполнения придет на смену\n
путем\r\n
(стандартной линии терминатора Windows) дает результат\r\r\n
.Возиться с
lineterminator
не является решением.источник
Примечание: кажется, что это не предпочтительное решение из-за того, как дополнительная система была добавлена в системе Windows. Как указано в документе Python :
Windows - одна из таких платформ, где это имеет значение. Хотя изменение разделителя строки, как я описал ниже, возможно, решило проблему, проблему можно полностью избежать, открыв файл в двоичном режиме. Можно сказать, что это решение более «элегантно». В этом случае «путаница» с ограничителем строки, вероятно, привела бы к непереносимости кода между системами, когда открытие файла в двоичном режиме в системе Unix не дает никакого эффекта. то есть. это приводит к кросс-совместимому коду.
Из документов Python :
Оригинал :
Как часть необязательных параметров для csv.writer, если вы получаете дополнительные пустые строки, вам, возможно, придется изменить определитель строки (информация здесь ). Пример ниже адаптирован со страницы Python CSV DOCS. Измените его с '\ n' на тот, который должен быть. Поскольку это всего лишь попытка решить проблему, это может или не может сработать, но это мое лучшее предположение.
источник
Я пишу этот ответ по отношению к Python 3, так как у меня изначально возникла та же проблема.
Я должен был получить данные из Arduino, используя
PySerial
, и записать их в файл .csv. Каждое чтение в моем случае заканчивалось'\r\n'
, поэтому новая строка всегда разделяла каждую строку.В моем случае
newline=''
опция не сработала. Потому что это показало какую-то ошибку вроде:Таким образом, казалось, что они не принимают пропуска новой строки здесь.
Видя только один из ответов здесь, я упомянул терминатор строки в объекте записи, например,
writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')
и это помогло мне пропустить лишние переводы строк.
источник
with open('my_file.csv', 'a',newline='') as csvfile:
работает абсолютно нормально. Проблема с вашим ответом состоит в том, что здесь вы пишете' '
вместо''
"Lineterminator = '\ r'" позволяет перейти к следующей строке, без пустой строки между двумя.
источник
Исходя из этого ответа , кажется, что самое чистое решение - это использовать
io.TextIOWrapper
. Мне удалось решить эту проблему для себя следующим образом:Ответ выше не совместим с Python 2. Для обеспечения совместимости, я полагаю, нужно просто обернуть всю логику записи в
if
блок:источник
Используйте метод, определенный ниже, чтобы записать данные в файл CSV.
Просто добавьте дополнительный
newline=''
параметр внутриopen
метода:Это будет записывать строки CSV без создания дополнительных строк!
источник
При использовании Python 3 пустых строк можно избежать с помощью модуля кодеков . Как указано в документации, файлы открываются в двоичном режиме, поэтому никаких изменений новой строки kwarg не требуется. Недавно я столкнулся с той же проблемой, и это сработало для меня:
источник