在python2中加载pickle文件(来自python3)

epx*_*epx 13 pickle python-2.7 python-3.x

我有一个泡菜文件

>>> with open("wikilinks.pickle", "rb") as f:
...     titles, links = pickle.load(f)
... 
>>> len(titles)
13421
Run Code Online (Sandbox Code Playgroud)

我可以在python3中加载它.但是,当我尝试在python2中加载它时,我收到此消息:Traceback(最近一次调用最后一次):

  File "<stdin>", line 2, in <module>
  File "/usr/lib/python2.7/pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "/usr/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 886, in load_proto
    raise ValueError, "unsupported pickle protocol: %d" % proto
ValueError: unsupported pickle protocol: 3
Run Code Online (Sandbox Code Playgroud)

那么如何在python2中加载它?

Lia*_*iao 26

读入python3并将其保存为python2格式

#!/usr/bin/env python3

import pickle

with open("a.pkl", "rb") as f:
    w = pickle.load(f)

pickle.dump(w, open("a_py2.pkl","wb"), protocol=2)
Run Code Online (Sandbox Code Playgroud)

然后你可以加载a_py2.pklpython2.


use*_*342 14

Python 3中默认使用的默认pickle协议与Python 2使用的协议不兼容.但是,如果您可以修改生成的代码wikilink.pickle,您可以告诉它使用早期协议之一(0,1或2) Python 2会理解的很好.

但请注意,Python 3字符串将在Python 2中作为Unicode字符串出现,这在一些用例中可能会令人惊讶.

$ python3
Python 3.4.1 (default, May 19 2014, 17:23:49) 
[GCC 4.9.0 20140507 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> pickle.dumps([1, 2, 'abc'], 2)
b'\x80\x02]q\x00(K\x01K\x02X\x03\x00\x00\x00abcq\x01e.'
>>> 
$ python 
Python 2.7.8 (default, Jul  1 2014, 17:30:21) 
[GCC 4.9.0 20140604 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cPickle
>>> cPickle.loads('\x80\x02]q\x00(K\x01K\x02X\x03\x00\x00\x00abcq\x01e.')
[1, 2, u'abc']
Run Code Online (Sandbox Code Playgroud)