2016-10-03 297 views
1

我有一個pickle文件,它在取消時拋出一個UnpicklingError: invalid load key, 'A'.異常。無論我是否嘗試在生成文件的Ubuntu 14.04計算機上或在Windows計算機上分析該異常,都會拋出異常。它包含26個數據點,在數據點11之後拋出異常。我懷疑我必須以某種方式意外地編輯文件,儘管我不知道何時或如何。我知道還有其他幾個關於這類錯誤的討論,但到目前爲止,我還沒有找到一篇文章告訴我是否以及如何在錯誤輸入後恢復數值(我懷疑其中一個值是不可挽回地丟失了)。有什麼辦法可以跳過它,繼續取下下一個?可以例如反方向拔出,即最後一個元素在先?然後,我可以向後工作,直到我點擊錯誤的條目,從而獲得其他值。 (我可以重新生成數據,但它會採取一兩天,所以我寧願避免這樣做,如果我能。)cPickle:UnpicklingError:無效加載密鑰,'A'

這是酸洗代碼:

with open('hist_vs_years2.pkl', 'ab') as hist_pkl: 
     pickle.dump(hist, hist_pkl, -1) 

這是取消代碼的代碼:

hist_vs_samples2 = [] 
more_values = True 

with open('hist_vs_years2.pkl', 'rb') as hist_vs_samples_pkl: 
    while more_values == True: 
     try: 
      hist_vs_samples2.append(pickle.load(hist_vs_samples_pkl)) 
     except EOFError: 
      more_values = False 

我應該補充說我正在使用cPickle。如果我嘗試使用鹹菜我收到以下錯誤unpickle:

File "C:\Anaconda2\lib\pickle.py", line 1384, in load 
    return Unpickler(file).load() 

    File "C:\Anaconda2\lib\pickle.py", line 864, in load 
    dispatch[key](self) 

KeyError: 'A' 
+0

請發佈pickle文件的相關部分。您的存儲代碼表明您只有一個對象,在這種情況下,您必須修復加載密鑰,因爲無法部分加載醃製對象。如果實際存儲了多個對象(不是多個對象的*列表*),則可以刪除已損壞的對象。如果你想自己做這個,'pickle.py'源文件列出了加載密鑰,這也解釋了格式。 – MisterMiyagi

+0

我的歉意,酸洗代碼坐在一個更大的循環。它們確實是單獨的對象。你怎麼知道鹹菜文件的相關部分?在此期間,我會嘗試在網上找到解釋。 –

+0

恐怕酸洗文件並不意味着用戶可讀。你必須自己挖掘它;爲了使它更簡單,打印所有工作對象的索引,然後從那裏搜索。 – MisterMiyagi

回答

1

當存儲多個對象(通過反覆dump,而不是從容器)泡椒將存儲順序泡菜文件中的對象,因此,如果一個對象被打破它可以在不破壞其他人的情況下被移除。

原則上,pickle格式被僞造成pickle.py。對於大多數情況,模塊開頭的操作碼足以將所發生的事情拼湊在一起。基本上,pickle文件是一個關於如何構建對象的指令。

鹹菜文件的可讀性取決於其鹹菜格式 - 0可行,以上所有內容均爲難度。是否可以修復或必須刪除完全取決於此。一致的是,每個單獨的泡菜都以點(.)結尾。例如,b'Va\np0\n.'b'\x80\x04\x95\x05\x00\x00\x00\x00\x00\x00\x00\x8c\x01a\x94.'兩者都是字符「的‘a’」,但在協議0-4

恢復的最簡單形式是計算對象的數量可以加載:

with open('/my/pickle.pkl', 'rb') as pkl_source: 
    idx = 1 
    while True: 
     pickle.load(pkl_source) 
     print(idx) 
     idx += 1 

然後打開pickle文件,跳過許多對象,並刪除所有內容,直到下一個.