2015-04-12 16 views
9

Ho un file sottaceto, conLoad (viene da python3) in python2

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

posso caricarlo in python3. Tuttavia, quando provo a caricare in python2, ottengo questo messaggio: Traceback (chiamata più recente scorso):

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 

Così come per caricarlo in python2?

risposta

10

Il default pickling protocol utilizzato in Python 3 per impostazione predefinita è incompatibile con il protocollo utilizzato da Python 2. Tuttavia, se è possibile modificare il codice che produce wikilink.pickle, è possibile indicare di utilizzare uno dei protocolli precedenti (0, 1, o 2) che Python 2 capirà bene.

Attenzione, però, che le stringhe Python 3 si presentano come stringhe Unicode in Python 2, il che può sorprendere in alcuni casi d'uso.

$ 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

Leggi in python3 e salvarlo come formato 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) 

Poi si può caricare a_py2.pkl in python2.

Problemi correlati