在Python中处理非ASCII字符的可靠方法?

时间:2015-07-07 18:24:44

标签: python python-2.7 unicode character-encoding non-ascii-characters

我的列是一个电子表格,其标题包含非ASCII字符,因此:

'Campaign'

如果我将此字符串弹出到解释器中,我会得到:

'\xc3\xaf\xc2\xbb\xc2\xbfCampaign'

该字符串是rows

csv.DictReader()中的键

当我尝试使用此密钥的value填充新的字典时:

spends['Campaign'] = 2

我明白了:

Key Error: '\xc3\xaf\xc2\xbb\xc2\xbfCampaign'

如果我打印行键的值,我可以看到它是'\xef\xbb\xbfCampaign'

显然,我可以更新我的程序以访问此密钥:

spends['\xef\xbb\xbfCampaign']

但是有更好的"在Python中这样做的方式?实际上,如果此密钥的值每次都更改为包含其他非ASCII字符,那么处理可能出现的所有非ASCII字符的无所不包的方式是什么?

2 个答案:

答案 0 :(得分:4)

您的具体问题是文件的前三个字节"\xef\xbb\xbf"。这是字节顺序掩码的UTF-8编码,并且通常预先添加到文本文件中以指示它们使用UTF-8进行编码。你应该删除这些字节。请参阅Removing BOM from gzip'ed CSV in Python

其次,您使用错误的编解码器进行解码。如果使用Windows-1252字符集解码这些字节,则会得到""。这就是如果在源文件中使用这些字符,字节看起来不同的原因。请参阅Python 2 Unicode howto

答案 1 :(得分:3)

通常,您应该在输入时尽快使用相应的字符编码将字节字符串解码为Unicode文本。反过来,在输出时尽可能晚地将Unicode文本编码为字节串。某些API(例如io.open())可以隐式执行,以便您的代码只能看到Unicode。

不幸的是,csv模块不直接在Python 2上支持Unicode。请参阅UnicodeReader, UnicodeWriter in the doc examples。您可以为csv.DictReader创建模拟,或者将utf-8编码的字节串传递给csv模块。