7

pandas DataFrames を使用して、python 2 と 3 の間で pickle のロード/保存を行う方法がわかりません。ピックラーには「プロトコル」オプションがありますが、私は失敗しましたが、誰かが私に試すための簡単なアイデアを持っていることを願っています. エラーを取得するコードは次のとおりです。

python2.7

>>> import pandas; from pylab import *
>>> a = pandas.DataFrame(randn(10,10))
>>> a.save('a2')
>>> a = pandas.DataFrame.load('a2')
>>> a = pandas.DataFrame.load('a3')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/pandas-0.10.1-py2.7-linux-x86_64.egg/pandas/core/generic.py", line 30, in load
    return com.load(path)
  File "/usr/local/lib/python2.7/site-packages/pandas-0.10.1-py2.7-linux-x86_64.egg/pandas/core/common.py", line 1107, in load
    return pickle.load(f)
ValueError: unsupported pickle protocol: 3

python3

>>> import pandas; from pylab import *
>>> a = pandas.DataFrame(randn(10,10))
>>> a.save('a3')
>>> a = pandas.DataFrame.load('a3')
>>> a = pandas.DataFrame.load('a2')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.3/site-packages/pandas-0.10.1-py3.3-linux-x86_64.egg/pandas/core/generic.py", line 30, in load
    return com.load(path)
  File "/usr/local/lib/python3.3/site-packages/pandas-0.10.1-py3.3-linux-x86_64.egg/pandas/core/common.py", line 1107, in load
    return pickle.load(f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf4 in position 0: ordinal not in range(128)

ピクルがpythonバージョン間で動作することを期待するのは少し楽観的ですか?

4

3 に答える 3

8

私も同じ問題を抱えていました。Python3 で次の関数を使用して、データフレーム ピクル ファイルのプロトコルを変更できます。

import pickle
def change_pickle_protocol(filepath,protocol=2):
    with open(filepath,'rb') as f:
        obj = pickle.load(f)
    with open(filepath,'wb') as f:
        pickle.dump(obj,f,protocol=protocol)

その後、問題なく python2 で開くことができるはずです。

于 2016-01-15T22:55:06.543 に答える
1

誰かが使用pandas.DataFrame.to_pickle()している場合は、ソース コードで次の変更を行って、ピクル プロトコル設定の機能を持たせます。

1)ソース ファイル/pandas/io/pickle.py(変更前に元のファイルを としてコピー/pandas/io/pickle.py.ori) で、次の行を検索します。

def to_pickle(obj, path):

pkl.dump(obj, f, protocol=pkl.HIGHEST_PROTOCOL)

これらの行を次のように変更します。

def to_pickle(obj, path, protocol=pkl.HIGHEST_PROTOCOL):

pkl.dump(obj, f, protocol=protocol)

2)ソース ファイル/pandas/core/generic.py(変更前に元のファイルを としてコピー/pandas/core/generic.py.ori) で、次の行を検索します。

def to_pickle(self, path):

return to_pickle(self, path)

これらの行を次のように変更します。

def to_pickle(self, path, protocol=None):

return to_pickle(self, path, protocol)

3) Python カーネルが実行されている場合は再起動し、利用可能な pickle プロトコル( 0、1、2、3、4)を使用してデータフレームを保存します。

# Python 2.x can read this
df.to_pickle('my_dataframe.pck', protocol=2)

# protocol will be the highest (4), Python 2.x can not read this
df.to_pickle('my_dataframe.pck')

4) pandas のアップグレード後、ステップ 1 と 2 を繰り返します。

5) (オプション)公式リリースでこの機能を使用するように開発者に依頼してください (これらの変更を行わないと、コードが他の Python 環境で例外をスローするため)

いい日!

于 2016-10-25T09:41:54.313 に答える