web-dev-qa-db-fra.com

Utilisation de pickle.dump - TypeError: doit être str, pas octets

J'utilise python3.3 et j'éprouve une erreur cryptique lorsque je tente de conserver un dictionnaire simple.

Voici le code:

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)

et je reçois:

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
195
John Rowland

Le fichier de sortie doit être ouvert en mode binaire:

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

doit être:

f = open('varstor.txt','wb')
332
Jon Clements

Je viens d'avoir le même problème. Dans Python 3, les modes binaires 'wb', 'rb' doivent être spécifiés alors que dans Python 2x, ils ne sont pas nécessaires. Lorsque vous suivez des tutoriels basés sur Python 2x, c'est pourquoi vous êtes ici.

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("------------")
11
Well Smith