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=''
.
# 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)
Примечание. Похоже, это не лучшее решение из-за того, как в системе Windows добавлялась дополнительная строка. Как указано в документе Python :
Если csvfile является файловым объектом, он должен быть открыт с флагом «b» на платформах, где это имеет значение.
Windows - одна из таких платформ, где это имеет значение. Хотя изменение ограничителя строки, как я описал ниже, могло решить проблему, ее можно было бы вообще избежать, открыв файл в двоичном режиме. Можно сказать, что это решение более «элегантное». В этом случае "возня" с ограничителем строки, вероятно, привела бы к непереносимости кода между системами, когда открытие файла в двоичном режиме в системе unix не дает никакого эффекта. т.е. это приводит к кросс-системному совместимому коду.
Из Документов Python :
В Windows к режиму добавлена буква b. открывает файл в двоичном режиме, поэтому есть также такие режимы, как 'rb', 'wb', и 'r + b'.Python в Windows делает различие между текстом и двоичным кодом файлы; символы конца строки в текстовые файлы изменяются автоматически слегка при чтении или записи данных. Эта закулисная модификация данные файла подходят для текста ASCII файлы, но это приведет к повреждению двоичных данных как в файлах JPEG или EXE. Быть очень осторожно использовать двоичный режим, когда чтение и запись таких файлов. На Unix, не помешает добавить букву "b" в режим, так что вы можете использовать его независимо от платформы для всех двоичных файлов файлы.
Исходный :
В рамках дополнительных параметров для csv.writer, если вы получаете лишние пустые строки, вам, возможно, придется изменить указатель строки (информация здесь ). Пример ниже адаптирован со страницы 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'])
Простой ответ заключается в том, что файлы csv всегда должны открываться в двоичном режиме как для ввода, так и для вывода, иначе в Windows возникают проблемы с окончанием строки. В частности, на выходе модуль csv напишет \ r \ n
(стандартный признак конца строки CSV), а затем (в текстовом режиме) среда выполнения заменит \ n
на \ r \ n
(стандартный терминатор строки Windows), что дает результат \ r \ r \ n
.
Возиться с ограничителем линии
НЕ является решением.