2010-12-02 3 views
1

Я использую следующее в Python2.x;csv module python3.1

import csv 
f = open('test.csv', 'wb') 
writer = csv.writer(f) 
writer.writerow((fpath, md5sum, size)) # <str>, <str>, <int> 

Это работает без проблем. Однако, когда я запускаю это в Python3, я получаю TypeError.

writer.writerow((fpath, md5sum, size)) 
TypeError: write() argument 1 must be bytes or buffer, not str 

Конечно, выписывая данные в файл в открытом в недвоичном режиме будет делать трюк, но мне нравится, как Unicode обрабатывается в PY3 и хочу конкретно кодировать данные перед записью в файл и декодировать его при чтении из него.

Как решить эту проблему?

+0

Итак, где именно вы декодируете/кодируете данные и как это связано с двоичным режимом? – SilentGhost

+0

Несомненно, точка разделения unicode/bytes состоит в том, что вы * не * должны иметь дело с кодированием/расшифровкой самостоятельно? Если вы хотите использовать другой кодек по умолчанию, см. Ответ Ignacio. –

+0

Не могли бы вы разъяснить, что вам не нужно иметь дело с кодировкой? С чем связано разделение unicode/bytes? –

ответ

6
f = open('test.csv', 'w', encoding='utf-8', newline='') 
+1

Этот ответ подходит для систем, отличных от Windows. Для переносимости все файлы 3.X csv должны быть открыты с помощью 'newline = ''', будь то чтение или запись. Письменное дело еще не задокументировано; отчет об ошибках поднят ... http://bugs.python.org/issue7198 –

+0

Документы исправлены - спасибо, @JohnMachin! –

Смежные вопросы