2012-02-25 14 views
6

Estoy tratando de datos una matriz de datos creada en Python3.2, salmuera, y luego ábrala en Python2.7. Sin embargo, hay una parte de los datos a los que se está oponiendo Python2.7, aunque en una muestra de los datos funciona bien, y me preguntaba cómo averiguar qué estaba pasando mal.Decapado utilizando el protocolo 2: Python3-> 2 datos

Así que en Python3.2:

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

Entonces, cuando se lee en Python2.7:

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

El error es:

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 

los datos es un conjunto de dicts, anidados como máximo dos profundos, por ejemplo:

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

¿Qué (probablemente) va mal aquí? ¿Hay alguna manera fácil de ver qué en el conjunto de datos original (grande) está causando el problema?

+0

¿Puedes publicar un enlace a una representación de texto de los datos que estás descargando (suponiendo que sea representable como texto)? – Taymon

+0

Es un archivo ~ 30MB (encurtido), así que no estoy seguro de lo útil que sería. También es parte de la razón por la que tengo problemas para identificar la causa particular del error ... todos los datos son representables como texto y son bastante similares al ejemplo dado, solo que con más pares clave-valor. – cohoz

+0

Bueno, el ejemplo funciona para mí (aunque, por supuesto, las cadenas vuelven como objetos Unicode). Entonces realmente no puedo decir qué podría estar yendo mal. – Taymon

Respuesta

2

Pickle no es tan bueno como podría parecer. Vulnerabilidades de seguridad y muchos problemas como estos.

Una idea mucho mejor es crear su propio formato de guardado, por ejemplo, usando json.

+0

Esto es lo que terminó siendo el mejor. La seguridad no es un problema aquí, y pude usar eval() para hacer la mayor parte del trabajo al final. – cohoz

Cuestiones relacionadas