Menggunakan pickle.dump - TypeError: harus str, bukan byte


242

Saya menggunakan python3.3 dan saya mengalami kesalahan samar ketika mencoba acar kamus sederhana.

Ini kodenya:

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)

dan saya mendapatkan:

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

Jawaban:


404

File output harus dibuka dalam mode biner:

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

perlu:

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

22
Setelah mengalami masalah yang sama persis, saya melihat di mana kebutuhan untuk membaca / menulis "biner" disebutkan dalam dokumen untuk pickle.dump()dan pickle.load(). Kedua tempat, ini disebutkan hanya lewat dekat tengah penjelasan fungsi. Seseorang harus membuat ini lebih jelas.
Matius

9
Saya mengajukan # 24159 dengan proyek Python. Mungkin ada sesuatu yang dapat dilakukan untuk meningkatkan pengalaman dalam situasi ini dan yang serupa.
Jason R. Coombs

1
Artikel ini tidak menyebutkan menggunakan mode wb dan muncul di bagian atas hasil pencarian dan ditulis pada tahun 2019: thoughtco.com/using-pickle-to-save-objects-2813661
deltaray

22

Baru saja mengalami masalah yang sama. Dalam Python 3, mode Biner 'wb', 'rb' harus ditentukan sedangkan dalam Python 2x, mereka tidak diperlukan. Ketika Anda mengikuti tutorial yang didasarkan pada Python 2x, itu sebabnya Anda ada di sini.

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("------------")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.