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

Jos*_*rns 6 python character-encoding mongodb

在Python中通过HTTP导入制表符分隔文件.

在将行的数据插入MongoDB之前,我将从字符串中删除斜杠,刻度和引号.

无论数据的编码是什么,MongoDB都给我一个例外:

bson.errors.InvalidStringData: strings in documents must be valid UTF-8
Run Code Online (Sandbox Code Playgroud)

所以在努力解决这个问题时,从我已经完成的阅读中我想尽可能快地使用unicode()函数将行的数据转换为Unicode.另外,我试过调用decode()函数传递"unicode"作为第一个参数,但收到错误:

LookupError: unknown encoding: unicode
Run Code Online (Sandbox Code Playgroud)

从那里,我可以进行字符串操作,例如替换斜线,刻度和引号.然后在将数据插入MongoDB之前,使用str.encode('utf-8')函数将其转换为UTF-8.

问题:转换为Unicode时,我收到错误

UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 1258: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

有了这个错误,我不确定在哪里继续.

我的问题是:如何在不知道编码的情况下成功导入文件中的数据并成功将其插入需要UTF-8的MongoDB?

非常感谢!

Joh*_*hin 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包括...用什么语言写的?[/编辑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:请考虑阅读Python Unicode HOWTO本文