2012-08-14 488 views
2

python對象是一個嵌套的字符串和數字列表。python cPickle unpickling error invalid load key

該文件被打開寫爲'w'(而不是'wb'),但cPickle被告知使用協議= 1(如此二進制)。

序列化和反序列化代碼在Linux上運行良好。我無法恢復保存在Windows機器上的對象(Python 2.6)。

我明白(現在)該文件應該已經在Windows中明確打開爲'wb',因爲行尾。也就是說寫入的對象是一個嵌套列表,並且不包含\ n,所以我不確定這是否重要。

我的問題是可以做些什麼來恢復數據?

這裏是print repr(open(fqfn, 'rb').read(15))結果:

']q\x01(]q\x02]q\x03(U\x0fst' 

任何想法讚賞。


我試圖l = cPickle.load(open(fqfn, 'r'))suggested by mhawke,但Windows送我一個EOF錯誤。

如果我直接在十六進制編輯器中打開文件,我可以簡單地將'\r\n'的實例替換爲1013,然後使用二進制模式恢復?

的輸入序列是這樣的:

[['start', 3454654], [1234567645, -1 , 99], [1234567900, 1 , 56], ...] 

我知道輸入的順序,每個列表的長度和一些值(例如開頭的字符串和一些號碼)。

所以我想我的問題是我是否可以通過編寫處理二進制編碼的腳本來反序列化。我不需要把它變成python對象 - ascii足夠好。

回答

0

我想你可能已經試圖通過在Windows機器上以文本模式'r'(即不是'rb')打開文件來取消打開該文件。如果你幸運的話下面應該工作:

import cPickle 
l = cPickle.load(open(fqfn, 'r')) 

您的數據可能不會包含新的生產線,但它可能包含的值,如10或13考慮以下幾點:

>>> cPickle.dumps(10, protocol=1) 
'K\n.' 
>>> cPickle.dumps(256, protocol=1) 
'M\x00\x01.' 
>>> cPickle.dumps(266, protocol=1) 
'M\n\x01.' 

的'\ n'在第一個是因爲ascii 10是新行字符,並且二進制pickle模式以這種方式存儲它。同樣,如果你醃266(256 + 10),你也會在輸出中看到'\ n'。

在Windows上,Python在寫入以「text」模式打開的文件時會自動將'\ n'轉換爲'\ r \ n'。在文本模式下閱讀時,它還將'\ r \ n'轉換爲'\ n'。所以,在Windows機器上以「文本」模式打開文件應該可以解決您的問題。