装载pickle时出现错误

6

无法加载pickle文件。我正在使用Python 3.5版本。

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

类型错误:需要字节类似对象,而不是“str”

。 。

尝试过以下方法:

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

反序列化错误:必须引用字符串操作码参数

. .

即使使用with语句,仍然会出现相同的错误

import pickle
with open("D:\\ud120-projects\\final_project\\final_project_dataset.pkl", "rb") as f:
    enron_data = pickle.load(f)
4个回答

13

我正在使用Windows 10和VSCode,您需要前往final_project_dataset.pkl文件,然后更改选项CRLF为LF,保存文件,然后UnpicklingError: the STRING opcode argument must be quoted错误就会消失。

在这里输入图片描述

将CRLF更改为LF。

在这里输入图片描述

然后保存final_project_dataset.pkl文件。


1
这个答案帮助了我的朋友。他的声誉不太好,所以我代表他发表评论。 - Clint
对于任何显示此错误的.pkl文件,此解决方案都适用(适用于Udacity的机器学习课程)。 - Sidrah Madiha Siddiqui

3

1
你正在使用这个数据集吗?https://github.com/udacity/ud120-projects/tree/master/final_project - Dale
我复制并粘贴了底部版本(带有open...),在Mac上的Python 2.7和3.6中都完美运行。你除了上面的代码还做了什么吗? - Dale
我正在使用 https://github.com/udacity/ud120-projects/blob/master/tools/email_authors.pkl,与您提到的略有不同,并且我正在使用Python 3.5在Windows上工作。 - Nimish Bansal
1
可能是Windows的问题。在我的OS X上它完美地工作。 - Dale

1

如果一整段脚本让你望而却步,其实只需要一行代码:

import pickle
with open("D:\\path\\to\\file.data", "rb") as f:
    lines = [line.rstrip("\r\n") for line in f.readlines()]
    data = pickle.loads("\n".join(lines))

我非常喜欢这个代码的简洁性,但是当我尝试使用列表推导式时,会抛出TypeError: a bytes-like object is required, not 'str'的错误。我在open()中使用了'rb'。有什么建议吗?我正在使用Python 3.8.5,Windows 10和Jupyter Notebook。 - Kaleb Coberly
'readlines()' 的输出是二进制输出的列表(例如 [b'(lp0\r\n', b"S' sbaile2'\r\n"]),而 rstrip() 似乎无法处理它;f.readlines()[0].rstrip('\r\n') 抛出相同的错误。有没有一种简洁的方法将二进制项转换为字符串,然后在替换其结束行之后将它们转换回二进制? - Kaleb Coberly

0

对我唯一的解决方法是(由Monkshow92在Github上回答):

" pickle文件必须使用Unix换行符,否则至少从Python 3.4开始的C pickle解析器会失败,并引发异常:pickle.UnpicklingError: the STRING opcode argument must be quoted 我认为一些git版本可能会将Unix换行符('\n')更改为DOS换行符('\r\n')。

您可以使用此代码将"word_data.pkl"更改为"word_data_unix.pkl",然后在脚本"nb_author_id.py"中使用新的.pkl文件: 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 改编自: https://dev59.com/9nE85IYBdhLWcg3wyGl_#19702943

我发现的一个小调整是,将“r”模式更改为“rb”字节对象模式。 最后使用上述Python脚本将所有.pkl文件从Dos转换为Unix!

答案链接:https://github.com/udacity/ud120-projects/issues/46 全部功劳归于:Monkshow92


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接