web-dev-qa-db-ja.com

Pickle:TypeError: 'str'ではなく、バイトのようなオブジェクトが必要です

python 3で次のコードを実行すると、このエラーが発生し続けます。

fname1 = "auth_cache_%s" % username
fname=fname1.encode(encoding='utf_8')
#fname=fname1.encode()
if os.path.isfile(fname,) and cached:
    response = pickle.load(open(fname))
else:
    response = self.heartbeat()
    f = open(fname,"w")
    pickle.dump(response, f)

ここに私が得るエラーがあります:

File "C:\Users\Dorien Xia\Desktop\Pokemon-Go-Bot-Working-Hack-API-master\pgoapi\pgoapi.py", line 345, in login
    response = pickle.load(open(fname))
TypeError: a bytes-like object is required, not 'str'

エンコード関数を使用してfname1をバイトに変換しようとしましたが、まだ問題は解決していません。誰かが間違っていることを教えてもらえますか?

24
D Xia

ファイルをバイナリモードで開く必要があります。

file = open(fname, 'rb')
response = pickle.load(file)
file.close()

そして書くとき:

file = open(fname, 'wb')
pickle.dump(response, file)
file.close()

余談ですが、withを使用してファイルの開閉を処理する必要があります。

読むとき:

with open(fname, 'rb') as file:
    response = pickle.load(file)

そして書くとき:

with open(fname, 'wb') as file:
    pickle.dump(response, file)
35
Farhan.K

Python 3では、 'rb'または 'wb'を明示的に呼び出す必要があります。

with open('C:\Users\Dorien Xia\Desktop\Pokemon-Go-Bot-Working-Hack-API-master\pgoapi\pgoapi.py', 'rb') as file:
    data = pickle.load(file)
10
MonRaj

私はこのスタックオーバーフローリンクに戻り続けているので、次に探しているときに実際の答えを投稿しています。

PickleDBは台無しになっており、修正する必要があります。

Pickledb.pyの201行目

から:

simplejson.dump(self.db, open(self.loco, 'wb'))

に:

simplejson.dump(self.db, open(self.loco, 'wt'))

問題は永遠に解決しました。

2
Dopple

「str」を「bytes」に変更する必要があります。これを試して:

class StrToBytes:
    def __init__(self, fileobj):
        self.fileobj = fileobj
    def read(self, size):
        return self.fileobj.read(size).encode()
    def readline(self, size=-1):
        return self.fileobj.readline(size).encode()

with open(fname, 'r') as f:
    obj = pickle.load(StrToBytes(f))
2
Jun