Pyd*_*man 1 python unicode character-encoding non-ascii-characters python-2.7
我有一个电子表格列,其标题包含非 ASCII 字符,因此:
\n\n\'\xc3\xaf\xc2\xbb\xc2\xbfCampaign\'\nRun Code Online (Sandbox Code Playgroud)\n\n如果我将此字符串放入解释器中,我会得到:
\n\n\'\\xc3\\xaf\\xc2\\xbb\\xc2\\xbfCampaign\'\nRun Code Online (Sandbox Code Playgroud)\n\nrows该字符串是a 中的键之一csv.DictReader()
value当我尝试使用此键填充新字典时:
spends[\'\xc3\xaf\xc2\xbb\xc2\xbfCampaign\'] = 2\nRun Code Online (Sandbox Code Playgroud)\n\n我得到:
\n\nKey Error: \'\\xc3\\xaf\\xc2\\xbb\\xc2\\xbfCampaign\'\nRun Code Online (Sandbox Code Playgroud)\n\n如果我打印行键的值,我可以看到它是\'\\xef\\xbb\\xbfCampaign\'
显然,我可以更新我的程序来访问这个密钥:
\n\nspends[\'\\xef\\xbb\\xbfCampaign\']\nRun Code Online (Sandbox Code Playgroud)\n\n但在 Python 中是否有“更好”的方法来做到这一点?事实上,如果该键的值每次更改为包含其他非 ASCII 字符,那么处理可能出现的任何非 ASCII 字符的包罗万象的方法是什么?
\n您的具体问题是文件的前三个字节"\\xef\\xbb\\xbf"。这是字节顺序掩码的 UTF-8 编码,通常放在文本文件前面以指示它们是使用 UTF-8 编码的。您应该剥离这些字节。请参阅在 Python 中从 gzip 压缩的 CSV 中删除 BOM。
其次,您使用错误的编解码器进行解码。"\xc3\xaf\xc2\xbb\xc2\xbf"是使用 Windows-1252 字符集解码这些字节时得到的结果。这就是为什么如果您在源文件中使用这些字符,字节看起来会有所不同。请参阅Python 2 Unicode howto。