Python3: запись файлов csv

Я пытаюсь использовать Python 3.2 на компьютере под управлением Windows для записи простого CSV файла, но мне не повезло. Из документации модуля csv для Python 3.2:

>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
...                         quotechar='|', quoting=csv.QUOTE_MINIMAL)
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

создает файл с каждой строкой, завершаемой байтовой последовательностью \r\r\n, поэтому похоже, что каждая строка имеет дополнительную пустую строку при ее открытии с помощью, например, MS Excel. Это не "файл CSV".

Заметьте, если я попробую тот же пример для Python 2.7 в Python 3.2 (где большая разница 'w' vs 'wb' для файлового режима), Я получаю сообщение об ошибке при попытке spamWriter.writerow:

Traceback (последний последний вызов): Файл "", строка 1, в TypeError: 'str' не поддерживает интерфейс буфера

Как написать простой файл CSV из Python 3.2 на компьютере под управлением Windows?

Ответ 2

Это будет работать как на Python 2, так и на Python 3:

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')

Ответ 3

Как задокументировано в footnote:

csv.writer(csvfile, dialect='excel', **fmtparams)

 Если csvfile является файловым объектом, его следует открыть с помощью newline = ''.

 Если newline = '' не указывается, новые строки, встроенные в кавычки, не будут интерпретироваться правильно, а на платформах, использующих \r\n linendings при записи добавляется дополнительный \r. Всегда должно быть безопасно указывать newline = '', так как модуль csv выполняет свою собственную (универсальную) обработку новой строки.

Следующий вариант работает в Linux и Windows:

spamWriter = csv.writer(open('eggs.csv', 'wb'), delimiter=' ', quotechar='|',
                        quoting=csv.QUOTE_MINIMAL, newline='')
spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

Ответ 4

Чтобы напрямую ответить на ваш вопрос, вы должны использовать параметр lineterminator:

... поэтому изменение этой строки должно работать (непроверено):

>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
...                         quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')

Что касается того, почему пример не работает из коробки, вид выглядит как ошибка для меня.

Ответ 5

[Для Python 2.x] Эта реализация spamWriter работает для меня...

with open('assignmentresults.csv', 'wb') as csvfile:
  spamwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
  spamwriter.writerow(["Hullo", "World"])

Ответ 6

Я решил эту ошибку, когда я переместил один из моих кодов из Python2.6.6 в python3.4.3

Python2.6.6 (я пытаюсь выполнить обфускацию на моем csvfile)

with open( os.path.join(path, name) , 'r') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))

Сработало хорошо с python2.6.6, но не работало на python3.4.3, поскольку я получал некоторые unicode-ошибки utf-8, когда я пытался запустить файл python3, поэтому сделал следующие изменения Python3.4.4

import codecs
with codecs.open(os.path.join(path, name) , 'r', encoding='ISO-8859-1') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))

Что он, мой код работает отлично сейчас, в основном python3 не рассматривает некоторые из Юникода, и нам нужно использовать импорт кодеков, чтобы он работал, надеюсь, что это поможет.