Pickle.dump kullanma - TypeError: bayt değil str olmalı


242

Python3.3 kullanıyorum ve basit bir sözlük seçmeye çalışırken şifreli bir hata yaşıyorum.

İşte kod:

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)

ve anladım:

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

Yanıtlar:


404

Çıktı dosyasının ikili modda açılması gerekir:

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

olması gerekir:

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

22
Sonra "ikili" okuma / yazma ihtiyacı sözü nerede tam olarak aynı sorun haline çalışıyor, gördüm dokümanlar için pickle.dump()ve pickle.load(). Her iki yerde de, bu sadece fonksiyon açıklamasının ortasına yakın bir yerden geçerken bahsedildi. Birisi bunu daha açık hale getirmelidir.
Matthew

9
# 24159'u Python projesi ile açtım . Belki de bu ve benzeri durumlarda deneyimi geliştirmek için yapılabilecek bir şey vardır.
Jason R. Coombs

1
Bu makale wb modunu kullandığından bahsetmiyor ve arama sonuçlarının üstünde görünüyor ve 2019'da yazıldı: thoughtco.com/using-pickle-to-save-objects-2813661
deltaray

22

Sadece aynı sorunu vardı. Python 3'te 'wb', 'rb' ikili modları belirtilmelidir, Python 2x'de ise buna gerek yoktur. Python 2x tabanlı öğreticileri takip ettiğinizde, bu yüzden buradasınız.

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("------------")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.