ใช้ pickle.dump - TypeError: ต้องเป็น str ไม่ใช่ไบต์


242

ฉันใช้ python3.3 และฉันมีข้อผิดพลาดที่เป็นความลับเมื่อพยายามดองพจนานุกรมง่ายๆ

นี่คือรหัส:

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)

และฉันได้รับ:

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

คำตอบ:


404

ไฟล์เอาต์พุตจำเป็นต้องเปิดในโหมดไบนารี:

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

ต้องเป็น:

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

22
หลังจากที่ทำงานเป็นว่าปัญหาเดียวกันผมเห็นความจำเป็นในการที่ "ฐาน" การอ่าน / เขียนได้รับการกล่าวถึงในเอกสารสำหรับและpickle.dump() pickle.load()ทั้งสองสถานที่นี้ถูกกล่าวถึงเฉพาะเมื่อผ่านใกล้กลางคำอธิบายฟังก์ชัน ใครบางคนควรทำให้เรื่องนี้ชัดเจนยิ่งขึ้น
แมทธิว

9
ฉันยื่น# 24159กับโครงการ Python อาจมีบางสิ่งที่สามารถทำได้เพื่อปรับปรุงประสบการณ์ในสถานการณ์เช่นนี้และที่คล้ายกัน
Jason R. Coombs

1
บทความนี้ไม่ได้กล่าวถึงการใช้โหมด wb และจะปรากฏที่ด้านบนสุดของผลการค้นหาและเขียนขึ้นในปี 2562: thoughtco.com/using-pickle-to-save-objects-2813661
deltaray

22

เพิ่งมีปัญหาเดียวกัน ใน Python 3 ต้องระบุโหมด 'wb', 'rb' ในขณะที่ใน Python 2x ไม่จำเป็นต้องใช้ เมื่อคุณทำตามบทช่วยสอนที่อ้างอิงจาก Python 2x นั่นเป็นเหตุผลที่คุณมาที่นี่

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("------------")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.