Estoy usando python3.3 y estoy teniendo un críptico mensaje de error al intentar pickle un simple diccionario.

Aquí está el código:

import os
import pickle
from pickle import *
os.chdir('c:/Python26/progfiles/')

def storvars(vdict):      
    f = open('varstor.txt','w')
    pickle.dump(vdict,f,)
    f.close()
    return

mydict = {'name':'john','gender':'male','age':'45'}
storvars(mydict)

y me sale:

Traceback (most recent call last):
  File "C:/Python26/test18.py", line 31, in <module>
    storvars(mydict)
  File "C:/Python26/test18.py", line 14, in storvars
    pickle.dump(vdict,f,)
TypeError: must be str, not bytes
  • Gracias por preguntar. Me preguntaba esto mismo lo estúpido. ha
  • valdría la pena aceptar que la respuesta no es la correcta, gracias.
InformationsquelleAutor John Rowland | 2012-12-16

2 Comentarios

  1. 331

    El archivo de salida tiene que ser abierto en modo binario:

    f = open('varstor.txt','w')

    debe ser:

    f = open('varstor.txt','wb')
    • Estoy en deuda con usted, Jon, para ayudar a mr con esto. El mensaje de error no dice LO que debe ser str, no en bytes, y a partir de ella, yo no podría haber trabajado fuera que debo abrir en modo binario. Estoy en lo cierto al pensar que yo debería usar ‘rb’ cuando la lectura de un escabeche de archivo?
    • Siempre es más seguro hacerlo @Juan
    • Después ejecutar exactamente el mismo problema, he visto donde la necesidad de «binario» de lectura/escritura se menciona en la docs para pickle.dump() y pickle.load(). Ambos lugares, esto fue mencionado sólo en pasar cerca de la mitad de la función de explicación. Alguien debería hacer esto más claro.
    • Yo presentada #24159 con el proyecto de Python. Tal vez hay algo que se puede hacer para mejorar la experiencia en esta y otras situaciones similares.
    • Me gustaría poder marcar esta aceptada por @JohnRowland , han sido 6 años
  2. 11

    Sólo tenía el mismo problema. En Python 3, modos Binarios ‘wb’, ‘rb’ debe ser especificado, mientras que en Python 2x, no son necesarios. Cuando usted sigue los tutoriales que están basadas en Python 2x, que es la razón por la que están aquí.

    import pickle
    
    class MyUser(object):
        def __init__(self,name):
            self.name = name
    
    user = MyUser('Peter')
    
    print("Before serialization: ")
    print(user.name)
    print("------------")
    serialized = pickle.dumps(user)
    filename = 'serialized.native'
    
    with open(filename,'wb') as file_object:
        file_object.write(serialized)
    
    with open(filename,'rb') as file_object:
        raw_data = file_object.read()
    
    deserialized = pickle.loads(raw_data)
    
    
    print("Loading from serialized file: ")
    user2 = deserialized
    print(user2.name)
    print("------------")

Dejar respuesta

Please enter your comment!
Please enter your name here