web-dev-qa-db-ja.com

TypeError:バイトのようなオブジェクトが必要です。「str」ではなくPython 2 Pickle file in Python 3

Python 3 Python 2で機能するコードを使用して、pickleファイルを開こうとしていますが、エラーが発生しています。コードは次のとおりです。

_with open(file, 'r') as f:
    d = pickle.load(f)

TypeError                                 Traceback (most recent call last)
<ipython-input-25-38f711abef06> in <module>()
      1 with open(file, 'r') as f:
----> 2     d = pickle.load(f)

TypeError: a bytes-like object is required, not 'str'
_

他のSO=の回答を見たところ、open(file ,'rb')を使用してopen(file ,'r')に切り替えるとこの問題が発生するという回答がありました。これで問題が解決した場合は、open(file ,'rb')実験するだけで次のエラーが発生しました:

_UnpicklingError                           Traceback (most recent call last)
<ipython-input-26-b77842748a06> in <module>()
      1 with open(file, 'rb') as f:
----> 2     d = pickle.load(f)

UnpicklingError: invalid load key, '\x0a'.
_

f = open(file, 'r')でファイルを開いてfを入力すると、次のようになります。

_<_io.TextIOWrapper name='D:/LargeDataSets/Enron/final_project_dataset.pkl' mode='r' encoding='cp1252'>
_

だから私も試しました:

_with open(file, 'rb') as f:
    d = pickle.load(f, encoding='cp1252')
_

「rb」を使用した場合と同じエラーが発生しました:

_UnpicklingError                           Traceback (most recent call last)
<ipython-input-27-959b1b0496d0> in <module>()
      1 with open(file, 'rb') as f:
----> 2     d = pickle.load(f, encoding='cp1252')

UnpicklingError: invalid load key, '\x0a'.
_
7
jss367

Encoding = bytesでロードするための説明。

Python2でpickle化する辞書があると仮定します

data_dict= {'key1': value1, 'key2': value2}
with open('pickledObj.pkl', 'wb') as outfile:
  pickle.dump(data_dict, outfile)

Python3でのunpickle

with open('pickledObj.pkl', 'rb') as f:
        data_dict = pickle.load(f, encoding='bytes')

注:辞書のキーは文字列ではなくなりました。それらはバイトです。

data_dict['key1'] #result in KeyError

data_dict[b'key1'] #gives value1

または使用

data_dict['key1'.encode('utf-8')] #gives value1
12
Sreeragh A R

ええ、Python 2と3のピクル形式の間にはいくつかの変更があります。可能であれば、Python 3.を使用してピクルスデータを再度作成することをお勧めします。

それが不可能/簡単でない場合は、別のエンコーディング設定で試してみるか('utf8'?を試してみましたか)、またはencoding='bytes'を使用してデータを読み込んでみてください ここ 次に、文字列をデコードしますコード内で、オブジェクトをさらに検査できます。

1
metakermit