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

Существует ли способ сделать его не помещенным дополнительная пустая строка?

391
задан martineau 6 December 2018 в 12:59
поделиться

3 ответа

В 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)

Ссылки на документацию

774
ответ дан 22 November 2019 в 23:47
поделиться

Примечание. Похоже, это не лучшее решение из-за того, как в системе 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'])
7
ответ дан 22 November 2019 в 23:47
поделиться

Простой ответ заключается в том, что файлы csv всегда должны открываться в двоичном режиме как для ввода, так и для вывода, иначе в Windows возникают проблемы с окончанием строки. В частности, на выходе модуль csv напишет \ r \ n (стандартный признак конца строки CSV), а затем (в текстовом режиме) среда выполнения заменит \ n на \ r \ n (стандартный терминатор строки Windows), что дает результат \ r \ r \ n .

Возиться с ограничителем линии НЕ является решением.

13
ответ дан 22 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: