pickle.dumpの使用-TypeError:バイトではなくstrでなければなりません


242

python3.3を使用していますが、単純な辞書をpickle化しようとすると、不可解なエラーが発生します。

これがコードです:

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()。どちらの場所でも、これは機能説明の中央付近でのみ言及されました。誰かがこれをより明確にする必要があります。
マシュー14

9
#24159をPythonプロジェクトに提出しました。おそらく、このような状況でのエクスペリエンスを改善するために実行できることがあるでしょう。
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.