加载泡菜时出错

时间:2017-07-28 08:13:24

标签: python python-3.x pickle pickler

无法加载pickle文件。我正在使用python 3.5

import pickle
data=pickle.load(open("D:\\ud120-projects\\final_project\\final_project_dataset.pkl", "r"))

TypeError:需要类似字节的对象,而不是'str'

也尝试过:

import pickle
data=pickle.load(open("D:\\ud120-projects\\final_project\\final_project_dataset.pkl", "rb"))

UnpicklingError:必须引用STRING操作码参数

即使使用with语句

也会出现相同的错误
import pickle
with open("D:\\ud120-projects\\final_project\\final_project_dataset.pkl", "rb") as f:
    enron_data = pickle.load(f)

4 个答案:

答案 0 :(得分:2)

我正在使用Windows 10和vscode,您应该转到final_project_dataset.pkl文件,然后将选项 CRLF更改为LF ,然后保存文件,然后UnpicklingError: the STRING opcode argument must be quoted错误将消失

enter image description here

将CRLF更改为LF

enter image description here

然后保存final_project_dataset.pkl文件。

答案 1 :(得分:1)

你肯定需要“rb”来读取文件,这解决了第一个问题。

第二个问题(STRING操作码参数)是因为该文件没有Unix行结尾。您需要通过脚本运行pkl文件来转换它们。如果你看到这个帖子,有一个名为“dos2unix”的脚本可以解决这个问题:

How to convert DOS/Windows newline (CRLF) to Unix newline (\n) in a Bash script?

答案 2 :(得分:1)

如果整个脚本使您失望,那么它实际上只值得一行:

SELECT categories.id, categories.description, initiatives.id, initiatives.description, initiativegroups.group
FROM categories
LEFT JOIN category_initiative ON categories.id = category_initiative.category_id
LEFT JOIN initiatives ON category_initiative.initiative_id = initiatives.id
LEFT JOIN initiativegroups ON initiatives.initiativegroup_id = initiativegroups.id
WHERE categories.id = '40'

答案 3 :(得分:0)

对我来说唯一的修复是(在Github中由Monkshow92回答):

" pickle文件必须使用Unix新行,否则至少Python 3.4的C pickle解析器失败,异常:pickle.UnpicklingError:必须引用STRING操作码参数 我认为一些git版本可能会将Unix新行(' \ n')更改为DOS行(' \ r \ n')。

您可以使用此代码更改" word_data.pkl" to" word_data_unix.pkl"然后在脚本上使用新的.pkl文件" nb_author_id.py": dos2unix.txt

#!/usr/bin/env python
"""
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py 
"""
original = "word_data.pkl"
destination = "word_data_unix.pkl"

content = ''
outsize = 0
with open(original, 'rb') as infile:
    content = infile.read()
with open(destination, 'wb') as output:
    for line in content.splitlines():
        outsize += len(line) + 1
        output.write(line + str.encode('\n'))

print("Done. Saved %s bytes." % (len(content)-outsize))

dos2unix.py addapted from: http://stackoverflow.com/a/19702943

我发现的小调整是,改变" r"模式到" rb"字节对象模式。 最后使用上面的python脚本转换所有.pkl文件,从Dos转换为Unix!

回答链接:https://github.com/udacity/ud120-projects/issues/46  完全信用:Monkshow92