Python 2.7 Unicodesv.DictReader不使用io.StringIO(Python 2.7)
我试图使用csv.DictReader解析带有特殊字符的UTF-8数据,但出现以下错误:Python 2.7 Unicodesv.DictReader不使用io.StringIO(Python 2.7),python-2.7,csv,utf-8,stringio,Python 2.7,Csv,Utf 8,Stringio,我试图使用csv.DictReader解析带有特殊字符的UTF-8数据,但出现以下错误: UnicodeEncodeError: 'ascii' codec can't encode character u'\xe3' in position 2: ordinal not in range(128) 我在网上阅读,发现Python2.7的csv库不能处理Unicode。我寻找了另一个库,找到了unicodesv 我用unicodecsv替换了csv,但得到了相同的错误。以下是我的代码的简化版本
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe3' in position 2: ordinal not in range(128)
我在网上阅读,发现Python2.7的csv库不能处理Unicode。我寻找了另一个库,找到了unicodesv
我用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
如果我将StringIO替换为BytesIO,编码工作正常,但我无法再发送换行符
参数,然后我得到:
Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
有人知道我怎么解决这个问题吗?Unicodesv不应该处理StringIO吗?谢谢我在unicodecsv github页面中打开了它,结果发现(我觉得有点反直觉),unicodecsv阅读器需要的是bytestring而不是unicode对象
在花了一些时间让Unicode和编码在我的脑海中变得更清晰之后,结果证明我一开始并不真的需要Unicodesv。毕竟,最初的问题是当使用.next()
进行迭代时,io.StringIO
,将unicode对象返回到csv.DictReader,这是TestRing所期望的。因此,如果Unicodesv也期望通过测试环,那么它显然无法解决问题
我的解决方案是更改传递给csv.DictReader的类似文件的对象,以便它返回正确编码的ByTestRing而不是unicode对象:
class UTF8EncodedStringIO(StringIO):
def next(self):
return super(UTF8EncodedStringIO, self).next().encode('utf-8')
udata = UTF8EncodedStringIO(unicode(data, 'utf-8-sig'), newline=None)
通过围绕StringIO编写这个简单的包装,而不是使用BytesIO,我可以解决编码问题,并从换行符
参数中获益。有一点解码/编码开销,但我没有其他选择。如果有人有更好的建议,欢迎分享