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='')
Это будет работать как на 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, и нам нужно использовать импорт кодеков, чтобы он работал, надеюсь, это поможет..