Sử dụng pickle.dump - TypeError: phải là str, không phải byte


242

Tôi đang sử dụng python3.3 và tôi đang gặp một lỗi khó hiểu khi cố gắng chọn một từ điển đơn giản.

Đây là mã:

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)

va tôi lây:

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

Câu trả lời:


404

Tệp đầu ra cần được mở ở chế độ nhị phân:

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

cần phải là:

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

22
Sau khi gặp vấn đề chính xác như vậy, tôi đã thấy nhu cầu đọc / viết "nhị phân" được đề cập trong các tài liệu cho pickle.dump()pickle.load(). Cả hai nơi, điều này chỉ được đề cập khi đi qua gần giữa giải thích chức năng. Ai đó nên làm cho điều này rõ ràng hơn.
Matthew

9
Tôi đã nộp # 24159 với dự án Python. Có lẽ có một cái gì đó có thể được thực hiện để cải thiện trải nghiệm trong tình huống này và tương tự.
Jason R. Coombs

1
Bài viết này không đề cập đến sử dụng chế độ wb và nó xuất hiện ở phía trên cùng của kết quả tìm kiếm và đã được viết vào năm 2019: thoughtco.com/using-pickle-to-save-objects-2813661
deltaray

22

Chỉ có vấn đề tương tự. Trong Python 3, các chế độ nhị phân 'wb', 'rb' phải được chỉ định trong khi trong Python 2x, chúng không cần thiết. Khi bạn làm theo các hướng dẫn dựa trên Python 2x, đó là lý do bạn ở đây.

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("------------")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.