无法加载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)
你肯定需要“rb”来读取文件,这解决了第一个问题。
第二个问题(STRING操作码参数)是因为该文件没有Unix行结尾。您需要通过脚本运行pkl文件来转换它们。如果你看到这个帖子,有一个名为“dos2unix”的脚本将为你解决这个问题:
How to convert DOS/Windows newline (CRLF) to Unix newline (\n) in a Bash script?
“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