2015-04-12 39 views
9

我有一個鹹菜文件,用負載鹹菜文件(來自python3)在python2

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

我可以在python3加載它。 然而,當我嘗試加載它在python2,我得到這個消息: 回溯(最近通話最後一個):

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 

那麼如何將其放入在python2?

回答

10

在Python 3中默認使用的default pickling protocol與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'] 
8

閱讀在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) 

然後你就可以在python2加載a_py2.pkl