2010-11-25 11 views
7

で解凍:それはうまく働いたUnpickingデータは、Pythonの3.1で、このコードを使ってPython 2.5 I格納されたデータではzlibの

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

、私はその過程での操作を実行して、そのデータを読み取ることができました逆。それは安全である必要はなく、人間の目には読めるものではありませんでした。私はそこに「test」を入れて、それが作成したファイルを開いた場合、それはこのように見えた:私たちは今のPython 3.1を使用するように強制していると我々はこれらを読むことができる何かをコーディングする必要があり、様々な理由から

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

データファイル。

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"のようなものを1つではなく4つの文字として解釈することです。後で多くのテストと検索ができますし、pickleをファイルにロードする方法を見つけることができず、pythonでこれらのコードを認識させてzlibに渡すこともできます。

私の質問は次のとおりです。 Python3.1を使用して元のデータを復元するにはどうすればよいですか?

クライアントにPython2.5をインストールして手動で行うことを頼んでみたいと思いますが、これは不可能です。

ご協力いただきありがとうございます。

答えて

10

問題は、実際にはbytesである必要があるときに、Python 3がpickled Python 2文字列をstrオブジェクトに変換しようとしていることです。これは、asciiコーデックを使用して行います。コーデックは256の8ビット文字をすべてサポートしていないため、例外が発生しています。

あなたは(すべて256個の文字をサポートしています)latin-1エンコーディングを使用して、再びbytesに文字列を符号化することによってこの問題を回避することができます

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

うわー、それは完璧に動作します!本当にありがとう! –

0

のPython 3は、バイナリデータと文字列を区別します。 Pickleはバイナリデータを必要としますが、ファイルをテキストとして開きます。解決策は次のとおりです。

open(file_name, 'wb') 
関連する問題