加载泡菜时出错

问题描述 投票:1回答:2

无法加载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)
python python-3.x pickle pickler
2个回答
1
投票

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

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

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


0
投票

The only Fix for me was(Answered by Monkshow92 in Github) :

“pickle文件必须使用Unix新行,否则至少Python 3.4的C pickle解析器失败,异常:pickle.UnpicklingError:必须引用STRING操作码参数我认为一些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 addapted from:http://stackoverflow.com/a/19702943

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

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

© www.soinside.com 2019 - 2024. All rights reserved.