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' против 'wb' для режима файла), я получаю ошибку при попытке spamWriter.writerow:

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

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

6 ответов

Решение

Документация говорит, что вы должны использовать open('eggs.csv', 'w', newline='')

http://docs.python.org/py3k/library/csv.html

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

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

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

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

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

Если не указывать символ новой строки = '', символы новой строки, встроенные в поля в кавычках, не будут интерпретироваться правильно, и на платформах, использующих строки \ r \ n при записи, будет добавлен дополнительный символ \ 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'])

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

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

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

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

[Для 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"])

Я решил эту ошибку, когда перемещал один из моих кодов из 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, так как я получал некоторые ошибки Unfode 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 не учитывает некоторые из Unicode, и нам нужно использовать импорт кодеков, чтобы он работал, надеюсь, это поможет..

Другие вопросы по тегам