Python 2.7 Unicodesv.DictReader不使用io.StringIO(Python 2.7)

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,但得到了相同的错误。以下是我的代码的简化版本

我试图使用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,但得到了相同的错误。以下是我的代码的简化版本:

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,我可以解决编码问题,并从
换行符
参数中获益。有一点解码/编码开销,但我没有其他选择。如果有人有更好的建议,欢迎分享