341 Stimmen

Pickle.dump verwenden - TypeError: muss str sein, nicht Bytes

Ich benutze Python 3.3 und ich habe einen kryptischen Fehler beim Versuch, ein einfaches Wörterbuch zu beizen.

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

560voto

Jon Clements Punkte 134241

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

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

sein muss:

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

43voto

Well Smith Punkte 695

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

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("------------")

1voto

Xinzhe Li Punkte 74

Pickle verwendet ein binäres Protokoll und akzeptiert daher nur binäre Dateien. Da das Dokument sagte im ersten Satz: "Das Pickle-Modul implementiert Binärprotokolle zur Serialisierung und De-Serialisierung".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X