【发布时间】:2015-03-22 13:17:28
【问题描述】:
我试图使用 csv.DictReader 来解析带有特殊字符的 UTF-8 数据,但出现以下错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe3' in position 2: ordinal not in range(128)
我在网上阅读并发现 Python 2.7 的 csv 库不处理 Unicode。我找了一个替代库,发现unicodecsv。
我用 unicodecsv 替换了 csv,但我得到了同样的错误。这是我的代码的简化版本:
from io import StringIO
from unicodecsv import DictReader, Dialect, QUOTE_MINIMAL
data = (
'first_name,last_name,email\r'
'Elmer,Fudd,elmer@looneytunes.com\r'
'Jo\xc3\xa3o Ant\xc3\xb4nio,Ara\xc3\xbajo,joaoantonio@araujo.com\r'
)
unicode_data = StringIO(unicode(data, 'utf-8-sig'), newline=None)
class CustomDialect(Dialect):
delimiter = ','
doublequote = True
escapechar = '\\'
lineterminator = '\r\n'
quotechar = '"'
quoting = QUOTE_MINIMAL
skipinitialspace = True
rows = DictReader(unicode_data, dialect=CustomDialect)
for row in rows:
print row
如果我用 BytesIO 替换 StringIO,编码有效,但我无法再发送 newlines 参数,然后我得到:
Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
有人知道我该如何解决这个问题吗? unicodecsv 不应该处理 StringIO 吗?谢谢
【问题讨论】:
标签: python-2.7 csv utf-8 stringio