从Python导入未知编码文件到MongoDB
我正在用Python通过HTTP导入一个用制表符分隔的文件。
在把一行数据放进MongoDB之前,我会先把字符串中的斜杠、撇号和引号去掉。
不管数据是什么编码,MongoDB总是给我抛出一个错误:
bson.errors.InvalidStringData: strings in documents must be valid UTF-8
为了尝试解决这个问题,我阅读了一些资料,想尽快用unicode()函数把这一行的数据转换成Unicode。此外,我还试着调用decode()函数,并把“unicode”作为第一个参数传进去,但也收到了错误:
LookupError: unknown encoding: unicode
接下来,我可以对字符串进行处理,比如替换掉斜杠、撇号和引号。然后在把数据放进MongoDB之前,我会用str.encode('utf-8')函数把它转换成UTF-8格式。
问题是:在转换成Unicode时,我收到了错误
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 1258: ordinal not in range(128)
遇到这个错误后,我不太确定接下来该怎么做。
我的问题是:如何在不知道文件编码的情况下成功导入数据,并顺利插入到需要UTF-8格式的MongoDB中呢?
非常感谢!
1 个回答
按顺序尝试以下步骤:
(0) 检查一下你去掉斜杠、引号等符号的操作是否搞坏了数据。什么是引号?请把你的代码展示出来。还请提供一份原始数据的样本……使用 print repr(sample_raw data)
并把输出结果复制粘贴到你问题的编辑中。
(1) 有个老话说:“如果一个文件的编码不明,或者说是 ISO-8859-1,那它就是 cp1252。”……你是从哪里得到这个文件的?如果它来自西欧、美洲,或者其他讲英语、法语、西班牙语的国家/地区,并且不是有效的 UTF-8,那么它很可能是 cp1252 编码。
[编辑 2] 你的错误字节 0x93 在所有从 cp1250 到 cp1258 的编码中都解码为 U+201C 左双引号……这段文字是用什么语言写的?[/编辑 2]
(2) 保存文件(在去掉引号之前),然后在浏览器中打开这个文件:看起来正常吗?当你点击查看 / 字符编码时,你看到了什么?
(3) 尝试一下 chardet
编辑,提供一些额外的建议:
一旦你知道了编码是什么(假设是 cp1252):
(1) 将你的输入数据转换为 Unicode: uc = raw_data.decode('cp1252')
(2) 作为 Unicode 处理数据(去掉斜杠、引号等): clean_uc = manipulate(uc)
(3) 你需要将数据输出为 UTF-8 编码: to_mongo = clean_uc.encode('utf8')
注意 1:你的错误信息说“无法解码字节 0x93 在位置 1258”……1258 字节是相当长的一段文本;这合理吗?你有没有查看过它所抱怨的数据?怎么查看的?你看到了什么?
注意 2:请考虑阅读 Python Unicode 指南 和 这篇文章