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

Jawaban:

404

File output harus dibuka dalam mode biner:

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

perlu:

f = open('varstor.txt','wb')
Jon Clements
sumber
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("------------")
Baiklah Smith
sumber