web-dev-qa-db-fra.com

Pickle: TypeError: un objet de type octet est requis, pas 'str'

Je continue à avoir cette erreur lorsque je lance le code suivant dans 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)

Voici l'erreur que je reçois:

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'

J'ai essayé de convertir le fname1 en octets via la fonction encoder, mais cela ne résout toujours pas le problème. Quelqu'un peut-il me dire ce qui ne va pas? 

12
D Xia

Vous devez ouvrir le fichier en mode binaire:

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

Et en écrivant:

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

En passant, vous devriez utiliser with pour gérer l'ouverture/la fermeture des fichiers:

En lisant:

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

Et en écrivant:

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

En Python 3, vous devez appeler spécifiquement «rb» ou «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)
7
MonRaj

Vous devez remplacer "str" ​​par "octets". Essaye ça:

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

Je reviens sans cesse sur ce lien de débordement de pile, alors je poste la vraie réponse pour la prochaine fois que je le cherche:

PickleDB est foiré et doit être corrigé.

Ligne 201 de pickledb.py

De:

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

à:

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

Problème résolu pour toujours.

1
Dopple