Estoy tratando de aprender a usar el pickle módulo en Python:

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

Aquí es lo que me pasa:

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 bien:

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


¿Qué estoy haciendo mal?

  • Sólo es algo que vale la pena mencionar: para el archivo de todos modos en Python, se debe agregar un 'b' para el final de la cadena, incluso si es sólo un 'rb', ya que es independiente de la plataforma.
  • No es específico de la plataforma newline transliteraciones, pero en 3.x hay un importante diferentes: Archivos abiertos en modo binario manejar sólo bytes, los archivos abiertos en modo de texto de la manija de sólo texto («unicode»). Mientras que el modo binario sin duda tiene sentido para los datos binarios, y el modo de texto pueden no aplicarse en algunos otros casos, su sugerencia es demasiado general. Si usted acaba de ir a decodificar los bytes de texto que se abre en modo binario es generalmente una tontería. Es más fácil y más robusto para dejar de Python que el mango, y es mejor a adivinar las codificaciones de lo que somos en codificar las codificaciones.
  • Ah, ok, me acabo de acordar de la lectura que en algún lugar de la python.org sitio.
InformationsquelleAutor Sergey | 2012-01-02

2 Comentarios

  1. 36

    El problema es que tienes que abrir el archivo en modo texto. Usted necesidad de utilizar el binario 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)
    >>> 
    • no recibí ningún tipo de error con ‘w’,trabajó muy bien !!!
    • estabas usando Python 3? Las cosas cambiaron.
    • He cambiado ‘w’ a ‘wb’ – a mí me funcionó, gracias!
    • no, me refiero a que se han trabajado en el pasado, y sólo dejó de trabajar en Python 3.
  2. 1

    El método de escritura para el archivo de objetos similares, solo se aceptará un único argumento de cadena. Los vertederos método en el módulo pickle automáticamente arroja argumentos como las cadenas, mientras que el método de descarga de escribir un escabeche de la representación del objeto en el archivo abierto. Desde el 123 no es una cadena de lanza de la TypeError error.

    Esto está reconocido en el pickle.volcado de la documentación.

    • Esto lo entiendo, pero ¿por qué no la primera pieza de código (la una con la vinagreta.dump) de trabajo?
    • Debido a que el método de la escritura en el archivo de objeto sólo acepta un único argumento de cadena.

Dejar respuesta

Please enter your comment!
Please enter your name here