1

文字列に選択して保存されている大量の numpy ndarrays があります。それは設計上の選択が不十分だったかもしれませんが、それは私がしたことであり、選択された文字列が変換されたか、途中で何かが変換されたように見えます.ピクルを解除しようとすると、それらが型strであることに気付き、次のエラーが発生します:

TypeError: 'str' does not support the buffer interface

私が呼び出すとき

numpy.loads(bin_str)

bin_str私が解凍しようとしているものはどこにありますか。印刷するbin_strとこんな感じ

b'\x80\x02cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02c_codecs\nencode\nq\x03X\x01\x00\x00\ ...

しばらく継続しているので、情報はそこにあるようですが、numpy/pickle が必要とする文字列形式に変換する方法がよくわかりません。気まぐれでやってみた

numpy.loads( bytearray(bin_str, encoding='utf-8') )

numpy.loads( bin_str.encode() )

どちらもエラーをスローします_pickle.UnpicklingError: unpickling stack underflow。何か案は?

PS:私はpython 3.3.2とnumpy 1.7.1を使用しています

編集

次のことを行うと、次のことがわかりました。

open('temp.txt', 'wb').write(...)
return numpy.load( 'temp.txt' )

配列を取得し、別のウィンドウからの出力をコピーして貼り付けること...を示します。unpickle するためにファイルに直接書き込もうとしましたが、うまくいきません。バイナリ ファイルに直接書き込むことができるものに変換するいくつかの正気な方法は、それを読み戻そうとすると pickle エラーになります。print(bin_str)bin_strTypeError: 'str' does not support the buffer interfacebin_str

編集 2 何が起こったのかというと、バイナリのピクル文字列が通常の文字列内にエンコードされてしまったということです。次のようなものです。

"b'pickle'"

これは残念なことであり、それを取り戻すためのこのばかげた複雑な方法を除いて、私はそれに対処する方法を理解していません:

open('temp.py', 'w').write('foo = ' + bin_str)
from temp import foo
numpy.loads( foo )

これは問題に対する非常に恥ずべき解決策のように思えるので、より良い解決策を教えてください!

4

1 に答える 1

2

保存された文字列は、ピッキング コードによって返されreprた元のインスタンスの s のようです。bytesそれは少し残念ですが、それほど悪くはありません。reprオブジェクトの「機械に優しい」表現を返すことを意図しており、多くの場合、次を使用して逆にすることができますeval

import numpy as np
import pickle

# this part has already happened
orig_obj = np.array([1,2,3])
orig_pickle = pickle.dumps(orig_obj)
saved_str = repr(orig_pickle)     # this was a mistake, but it's already done

# this is what you need to do to get something equivalent to orig_obj back
reconstructed_pickle = eval(saved_str)
reconstructed_obj = pickle.loads(reconstructed_pickle)

# test
if np.all(reconstructed_obj == orig_obj):
    print("It worked!")

を使用evalすると危険な場合があることに注意してください。evalは任意の Python コードを実行できることに注意してください。そのため、信頼できないデータで呼び出さないでください。ただし、ピクル データにも同じリスクがあります (悪意のあるピクル文字列は、ピクル解除時に任意のコードを実行できます)、この状況で安全性を失うことはあまりありません。とにかく、この場合、あなたは自分のデータを信頼していると思います。

于 2013-10-28T22:33:05.237 に答える