2011-11-30 6 views
5

Estoy usando la última versión de Python y después de buscar, parece que no puedo encontrar nada en los encurtidos que me funcione.sintaxis de picking de Python

Simplemente estoy repasando tutoriales tratando de aprender sobre decapado y ninguno de los códigos fuente que aparentemente funciona en los tutoriales me funcionará, sospecho que esto tiene que ver con que los tutoriales están desactualizados.

Lo que he tratado y es el mismo que lo que muestran tutoriales es:

import pickle 
lists = [1,2,3,4,5] 
pickle.dump(lists, open('log.txt', 'a+')) 

que me da el siguiente error:

Traceback (most recent call last): 
File "<pyshell#2>", line 1, in <module> 
pickle.dump(lists, open('log.txt', 'a+')) 
TypeError: must be str, not bytes 

este

>>> import pickle 
>>> unpicklefile = open('log.txt', 'r') 
>>> unpickledlist = [1,2,3,4,5] 
>>> unpickledlist = pickle.load(unpicklefile) 

me la da siguiente error:

Traceback (most recent call last): 
File "<pyshell#3>", line 1, in <module> 
unpickledlist = pickle.load(unpicklefile) 
TypeError: 'str' does not support the buffer interface 

Gracias por todas las respuestas y ayudar a

+0

Su código funciona bien para mí sin errores (a excepción de que coincida con los nombres de archivo utilizados). Entonces, ** ¿qué error obtuviste en realidad **? –

+0

editó la pregunta –

+0

Parece que está siguiendo un tutorial diseñado para Python 2.x, mientras que parece estar usando Python 3.x. Hay diferencias sutiles, y si desea utilizar Python 3.x, entonces sería mejor seguir un tutorial diseñado para esa versión. –

Respuesta

2

El modo 'a+' puede estar causando problemas. Y, si está en Windows, sería útil abrir un archivo en modo binario. Además, debe cerrar el archivo antes de volver a abrir para leer de nuevo y asegúrese de que está escribiendo y leyendo el mismo archivo ('log.txt' vs 'nombre'):.

import pickle 
lists = [1,2,3,4,5] 

f = open('tmp_pickle.pic', 'wb') 
pickle.dump(lists, f) 
f.close() 

f = open('tmp_pickle.pic', 'rb') 
unpickledlist = pickle.load(f) 
print unpickledlist 
+0

Esto parece funcionar para mí, así que probablemente tengas razón sobre el problema porque estoy usando 'a +'. Gracias por la ayuda :) –

+0

Esta respuesta resuelve el problema porque al abrir un archivo con un modo ''b'' (en Python 3.x) se espera' bytes' del escritor en lugar de 'str' (que es un Unicode no codificado cuerda). El módulo 'pickle' espera poder escribir' bytes', ver [la documentación 'pickle.dump'] (http://docs.python.org/py3k/library/pickle.html#pickle.dump) para más detalles ("El argumento * file * debe tener un método write() que acepte un solo argumento de bytes.") –

Cuestiones relacionadas