我的列是一个电子表格,其标题包含非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字符的无所不包的方式是什么?
答案 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
模块。