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(). 두 곳 모두 함수 설명의 중간 부분을 지나갈 때만 언급되었습니다. 누군가 이것을 명확하게해야합니다.
Matthew

9
Python 프로젝트에 # 24159 를 제출 했습니다. 아마도이 상황과 비슷한 상황에서 경험을 향상시키기 위해 할 수있는 일이있을 것입니다.
Jason R. Coombs

1
이 문서에서는 WB 모드를 사용하여 언급하지 않으며, 검색 결과의 상단에 나타납니다 2019에 작성되었습니다 : 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.