CSV, DictWriter, Unicode и UTF-8 - PullRequest
       25

CSV, DictWriter, Unicode и UTF-8

5 голосов
/ 20 июля 2010

У меня проблемы с символами DictWriter и не-ascii.Короткая версия моей проблемы:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import codecs
import csv

f = codecs.open("test.csv", 'w', 'utf-8')
writer = csv.DictWriter(f, ['field1'], delimiter='\t')
writer.writerow({'field1':u'å'.encode('utf-8')})
f.close()

Дает эту трассировку:

Traceback (most recent call last):
File "test.py", line 10, in <module>writer.writerow({'field1':u'å'.encode('utf-8')})
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/csv.py", line 124, in writerow
return self.writer.writerow(self._dict_to_list(rowdict))
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py", line 638, in write
return self.writer.write(data)
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/codecs.py", line 303, in write data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

Я немного растерялся, поскольку DictWriter должен иметь возможность работать с UTF-8 из того, что у меня естьпрочитайте в документации.

1 Ответ

9 голосов
/ 20 июля 2010

Объект, который вы получаете с помощью codecs.open, хочет Unicode строку в своем методе write - вот и весь смысл.csv.DictWriter, конечно, вызывает этот метод с байтовой строкой в ​​кодировке utf8, откуда исключение.

Измените создание f на f = open("test.csv", 'wb') (исключив codecs из картинки) ивсе должно работать просто отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...