将具有未知编码的文件从Python导入MongoDB

时间:2011-01-13 21:38:05

标签: python character-encoding 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 :(得分:7)

按顺序尝试这些:

(0)检查你删除斜杠/刻度/等是不是在屠杀数据。什么是勾?请出示您的代码。请显示原始数据的示例...使用print repr(sample_raw data)并将输出复制/粘贴到您的问题的编辑中。

(1)有一句古老的格言:“如果文件的编码未知,或者说是ISO-8859-1,那就是cp1252”......你从哪里得到它?如果它来自西欧,美洲,或其他任何英语/法语/西班牙语国家/地区,并且它不是有效的UTF-8,那么它很可能是cp1252

[编辑2] 您的错误字节0x93解码为U + 201C LEFT DOUBLE QUOTATION MARK,适用于所有编码cp1250至cp1258,包括...所写的文字是什么语言? [/ Edit 2]

(2)保存文件(删除标记之前),然后在浏览器中打开文件:它看起来是否合理?点击查看/字符编码后你会看到什么?

(3)尝试chardet

修改并提供更多建议:

一旦你知道编码是什么(让我们假设它是cp1252):

(1)将输入数据转换为unicode:uc = raw_data.decode('cp1252')

(2)将数据(删除斜杠/刻度/等)处理为unicode:clean_uc = manipulate(uc)

(3)您需要输出编码为utf8的数据:to_mongo = clean_uc.encode('utf8')

注1:您的错误消息显示“无法解码位置1258中的字节0x93”... 1258字节是一个相当长的文本块;这个合理吗?你有没看过它抱怨的数据?怎么样?你看到了什么?

注意2:请考虑阅读the Python Unicode HOWTOthis article