2011-06-13 77 views
13

我得到這個錯誤,我不知道它是什麼意思。我該如何解決這個問題?Python中酸洗錯誤?

我的代碼看起來是這樣的,我曾經使用過它,它一直:

parentdir = os.getcwd() 
dirlist = os.listdir(parentdir) 

for dir in dirlist: 
    if not dir == "pubs_edits": continue 
    if os.path.isdir(os.path.join(parentdir, dir)): 
         os.chdir(os.path.join(parentdir, dir)) 
         file_list = os.listdir(os.path.join(parentdir, dir)) 
         for f in file_list: 
          in1 = open(f, 'r') 
          dict2 = pickle.load(in1) 

這是錯誤消息:

File "/home/md202/pmid_editor.py", line 18, in <module> 
     dict2 = pickle.load(in1) 
    File "/usr/lib/python2.5/pickle.py", line 1370, in load 
     return Unpickler(file).load() 
    File "/usr/lib/python2.5/pickle.py", line 858, in load 
     dispatch[key](self) 
KeyError: '\x00' 
+2

完整的tacebacks請....這是你自己的代碼?如何重現? – 2011-06-13 14:40:49

+0

你有什麼不知道的?如果它是您定義的類的實例,您是否導入了類? – 2011-06-13 14:44:18

+0

我解開一個字典,我醃到一個文件。 – marsx 2011-06-13 14:46:11

回答

-1

也許你應該嘗試另一種協議嘗試pickle.load(in1, 2)

+0

這是什麼意思? – marsx 2011-06-13 14:50:59

+0

查看模塊文檔[鏈接](http://docs.python.org/library/pickle.html#data-stream-format),load函數接受一個可選參數,該參數定義數據如何被醃漬。 – Chakib 2011-06-13 15:18:21

+2

根據文檔,load()不採用可選參數,只有轉儲。 – a1an 2015-06-16 08:24:30

13

發生這種確切的錯誤對我來說,當我試圖unpickle(使用pickle.loads),我已通過Django的存儲在數據庫中的字符串表示。 Django改變了我的字符串的特徵表示,以致於pickle.loads(mystring)丟給我那個錯誤。當我添加一個明確的字符串轉換時,它很好:pickle.loads(str(mystring))

編輯:看原始帖子上的評論,我認爲這與提到的unicode字符串問題有關。我把一個普通的字符串放入數據庫,並且django給了我一個產生這個錯誤的unicode字符串。

+0

你的回答剛剛幫我解決了我的問題。我正在使用應用程序引擎,並已將醃製字符串作爲db.Text()屬性存儲,當我應該使用db.Blob() – 2012-04-19 04:07:48

+0

感謝馬特,我有確切的錯誤你指定我試圖將它保存在數據庫中使用Django並在取出對象時得到此錯誤。 – Anto 2013-12-03 12:12:06

+0

大概這個錯誤不會發生在Python 3+上? – Demis 2016-05-25 00:08:07

3

我有類似的問題,導致KeyError: '\x1f'

在我的情況下,如果被醃製到gzip文件(即:gzip.open(fileName,'wb')),並且我試圖用正常的文件對象(即:open(fileName,'rb'))讀取它。

+0

看起來醃製文件使用gzip來玩棘手。我的醃製文件看起來像一個gzip(根據'文件'),但是當我嘗試對它進行gunzip時,它返回了一個很小(從200M到10K)的殘缺文件,其中沒有有用的數據(pickle.load給出了相同的KeyError: '\ x00'問題與這樣一個解壓縮文件。 – a1an 2015-06-16 08:40:24

+0

看起來像文件不完整或損壞。如果它被醃文本格式,你可以看看'zcat myfile' - 它看起來合理? – drevicko 2015-06-16 22:09:03

+0

這可能是損壞了,我試圖重新生成它,當加載時沒有更多錯誤 – a1an 2015-06-17 12:56:09

-1

當我嘗試在django中自動填充數據時,我遇到了同樣的問題。 問題是,可能存在一些隱藏的非pkl文件,如'.DS_Store'。所以,如果是這樣的話,你可以通過加載,所以你只是得到了「PKL」文件之前將正則表達式過濾器處理這個問題:

import re 

for dir in dirlist: 
    if not dir == "pubs_edits": continue 
    if os.path.isdir(os.path.join(parentdir, dir)): 
     os.chdir(os.path.join(parentdir, dir)) 
     file_list = os.listdir(os.path.join(parentdir, dir)) 
     reg = re.compile(r'pkl') 
     for f in file_list: 
      if reg.search(f): 
       in1 = open(f, 'r') 
       dict2 = pickle.load(in1) 
0

泡菜是二進制的,所以你必須閱讀它是這樣。 ('r')不要('r')嘗試使用('rb')讀取二進制文件。另外,如果您編寫文件確保您將pickle文件作爲二進制文件('wb')。這應該工作,希望它有幫助。

+0

不知道爲什麼你被低估了,這是我尋找的答案。一個容易犯的錯誤! – user2677280 2017-12-08 17:55:00