2017-07-28 97 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