2012-02-25 5 views
6

Sto provando a creare una matrice di dati creata in Python3.2, metterla in pickle e quindi aprirla in Python2.7. Tuttavia, c'è una parte dei dati a cui Python2.7 si oppone, anche se su un campione di dati va bene, e mi chiedevo come capire cosa stava andando storto.Decapaggio utilizzando il protocollo 2: Python3-> 2 dati

Così in Python3.2:

import pickle 
with open('c:\\test.pickle', mode='wb') as f: 
    pickle.dump(t_array, f, 2) 

Poi, durante la lettura in Python2.7:

import pickle 
f = open('c:\\test.pickle', mode='rb') 
t_data = pickle.load(f) 

L'errore è:

File "C:\Python27\lib\pickle.py", line 1378, in load 
    return Unpickler(file).load() 
File "C:\Python27\lib\pickle.py", line 858, in load 
    dispatch[key](self) 
File "C:\Python27\lib\pickle.py", line 1217, in load_build 
    setstate(state) 
TypeError: must be char, not unicode 

i dati sono una serie di dicts, annidati al massimo due profondità, ad es .:

{'key3': '3', 'key2': 1.1, 'key1': 1, 'dict': {'dkey2': 2, 'dkey1': 1}} 

Che cosa (probabilmente) sta andando male qui? C'è un modo semplice per vedere che cosa nel file di dati originale (grande) sta causando il problema?

+0

Puoi pubblicare un collegamento a una rappresentazione testuale dei dati che stai scaricando (assumendo che sia rappresentabile come testo)? – Taymon

+0

È un file di ~ 30 MB (mentre è in salamoia), quindi non sono sicuro di quanto sarebbe utile. Fa parte anche del motivo per cui ho qualche problema nell'individuare la causa specifica dell'errore ... tutti i dati sono rappresentabili come testo ed è abbastanza simile all'esempio dato, solo con più coppie chiave-valore. – cohoz

+0

Bene, l'esempio funziona per me (anche se, ovviamente, le stringhe tornano come oggetti Unicode). Quindi non posso davvero dire cosa potrebbe andare storto. – Taymon

risposta

2

Pickle non è buono come potrebbe sembrare. Vulnerabilità della sicurezza e molti problemi come questi.

Un'idea molto migliore è creare il proprio formato di salvataggio, ad esempio utilizzando json.

+0

Questo è quello che è diventato il migliore. La sicurezza non è un problema qui, e sono stato in grado di usare eval() per fare la maggior parte del lavoro alla fine. – cohoz