2017-07-28 99 views
0

无法加载pickle文件。我使用Python 3.5加载pickle时出错

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

类型错误:一类字节对象是必需的,而不是 '海峡'

。 。

也试过:

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

UnpicklingError:字符串操作码参数必须用引号引起来

。 。与报表

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

回答

1

使用时甚至

同样的错误你肯定需要“RB”读取文件,解决了第一个问题。

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

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

+0

错误:UnpicklingError:无效负载的关键,“ –

+1

你使用这个数据集? https://github.com/udacity/ud120-projects/tree/master/final_project – Dale

+0

我复制并粘贴了底部版本(打开...),并且它在Mac上的Python 2.7和3.6上都能很好地工作。除了上面的代码,你还在做些什么吗? – Dale

0

对我来说,唯一的解决方法是(通过Monkshow92在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插入从: http://stackoverflow.com/a/19702943

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

答案链接:https://github.com/udacity/ud120-projects/issues/46 完全学分制:Monkshow92

+0

对不起,我低估了这个答案,因为你提供了*完全相同的解决方案。 – Dale