2012-01-02 19 views
17

estoy tratando de aprender a utilizar el módulo pickle en Python:Uso de pickle.dump en Python

import pickle 
x = 123 
f = open('data.txt','w') 
pickle.dump(x,f) 

Esto es lo que me sale:

Traceback (most recent call last): 
    File "D:\python\test.py", line 5, in <module> 
    pickle.dump(x,f) 
TypeError: must be str, not bytes 

Sin embargo, este código funciona igual fina:

import pickle 
dump = pickle.dump(123) 
print(dump) 


¿Qué estoy haciendo mal?

+0

Sólo algo vale la pena mencionar: para todos los modos de archivo en Python, se debe añadir un ' 'b'' al final de la cadena, incluso si es sólo '' rb'' , ya que es plataforma independiente. – Edwin

+0

@Edwin: No hace transliteraciones de línea nueva específicas de plataforma, pero en 3.x hay una diferencia importante: los archivos abiertos en modo binario manejan solo bytes, los archivos abiertos en modo texto manejan solo texto ("unicode"). Si bien el modo binario ciertamente tiene sentido para los datos binarios, y el modo de texto puede no aplicarse en algunos otros casos, su sugerencia es demasiado general. Si acaba de decodificar los bytes a texto, la apertura en modo binario generalmente no tiene sentido. Es más fácil y más sólido dejar que Python maneje eso, y es mejor adivinar las codificaciones que las codificaciones de codificación. – delnan

+0

@delnan Ah, vale; Acabo de recordar leer eso en algún lugar del sitio de python.org. – Edwin

Respuesta

30

El problema es que está abriendo el archivo en modo texto. Es necesario utilizar binaria aquí:

>>> f = open('data.txt','w') 
>>> pickle.dump(123,f) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: must be str, not bytes 
>>> 
>>> f = open('data.txt','wb') 
>>> pickle.dump(123,f) 
>>> 
+0

no recibí ningún error con 'w', funcionó bien! –

+3

@SrinivasReddyThatiparthy: ¿estabas usando Python 3? Las cosas cambiaron – DSM

+0

@DSM, cambié 'w' a 'wb' - funcionó para mí, ¡gracias! – Sergey

1

El método de escritura para objetos de tipo archivo, solo acepta un único argumento de cadena. El método dumps en el módulo pickle automáticamente arroja argumentos como cadenas, mientras que el método dump escribirá una representación reducida del objeto al archivo abierto. Como 123 no es una cadena, arroja el error TypeError.

Esto se reconoce en pickle.dump documentation.

+0

Esto lo entiendo, pero ¿por qué no funciona la primera pieza de código (la que tiene pickle.dump)? – Sergey

+0

Porque el método de escritura en el objeto de archivo solo acepta un único argumento de cadena. – garnertb