Verwenden von pickle.dump - TypeError: muss str sein, keine Bytes

242

Ich verwende python3.3 und habe einen kryptischen Fehler, wenn ich versuche, ein einfaches Wörterbuch auszuwählen.

Hier ist der 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)

und ich bekomme:

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

Antworten:

404

Die Ausgabedatei muss im Binärmodus geöffnet werden:

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

muss sein:

f = open('varstor.txt','wb')
Jon Clements
quelle
22
Nachdem ich auf genau das gleiche Problem gestoßen war, sah ich, wo in den Dokumenten für pickle.dump()und die Notwendigkeit des "binären" Lesens / Schreibens erwähnt wurde pickle.load(). An beiden Stellen wurde dies nur kurz neben der Mitte der Funktionserklärung erwähnt. Jemand sollte dies klarer machen.
Matthew
9
Ich habe # 24159 beim Python-Projekt eingereicht . Vielleicht kann etwas getan werden, um die Erfahrung in dieser und ähnlichen Situationen zu verbessern.
Jason R. Coombs
1
In diesem Artikel wird die Verwendung des wb-Modus nicht erwähnt. Er wird oben in den Suchergebnissen angezeigt
deltaray
22

Hatte gerade das gleiche Problem. In Python 3 müssen die Binärmodi 'wb', 'rb' angegeben werden, während sie in Python 2x nicht benötigt werden. Wenn Sie Tutorials folgen, die auf Python 2x basieren, sind Sie hier.

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("------------")
Nun, Smith
quelle