2010-11-25 60 views
7

使用此代碼解壓縮在Python 2.5我存儲的數據:在Python 2.5醃製Unpicking數據,在Python 3.1,然後用zlib的

def GLWriter(file_name, string): 
    import cPickle 
    import zlib 
    data = zlib.compress(str(string)) 
    file = open(file_name, 'w') 
    cPickle.dump(data, file) 

它工作得很好,我能夠做在這一進程中讀取數據相反。它不需要安全,只是人眼看不到的東西。如果我把「測試」了進去,然後打開它創建的文件,它是這樣的:

S'x\x9c+I-.\x01\x00\x04]\x01\xc1' 
p1 
. 

由於各種原因,我們不得不使用Python 3.1,現在,我們需要編寫的東西,可以讀取這些數據文件。

Pickle不再接受字符串輸入,所以我不得不用rb打開文件。當我這樣做,並嘗試與和pickle.load(文件)打開它,我得到這個錯誤:

File "<stdin>", line 1, in <module> 
File "C:\Python31\lib\pickle.py", line 1365, in load 
    encoding=encoding, errors=errors).load() 
UnicodeDecodingError: 'ascii' codec can't decode byte 0x9c in position 1: ordinal not in range(128) 

盤算,我可能無法打開泡菜的文件,我開始做一些研究和發現, pickle只是在zlib正在生成的主要數據塊的每一側包裹幾個字符。然後我試着將其修剪爲zlibs輸出,並通過zlib.decompress進行修改。我的問題是它讀取文件並將「\ x04」這樣的喜歡解釋爲四個字符而不是一個字符。大量的測試和搜索後,我找不到一種方法來使醃菜加載文件,或使python識別這些代碼,所以我可以通過zlib。

所以我的問題是這樣的: 如何使用Python3.1恢復原始數據?

我很想問我的客戶安裝Python2.5並手動執行,但這是不可能的。

非常感謝您的協助!

回答

10

問題是,Python 3試圖將醃製的Python 2字符串轉換爲str對象,當您確實需要它時bytes。它使用ascii編解碼器執行此操作,該編解碼器不支持全部256個8位字符,因此您將收到異常。

您可以解決此通過使用latin-1編碼(支持所有256個字符),然後編碼字符串返回到bytes

s = pickle.load(f, encoding='latin1') 
b = s.encode('latin1') 
print(zlib.decompress(b)) 
+1

哇,這完美的作品!非常感謝! – 2010-11-26 01:01:33

0

Python 3中,使二進制數據和字符串之間的區別。 Pickle需要二進制數據,但是您將文件打開爲文本。解決方案是使用:

open(file_name, 'wb')