ValueError: protocolo pickle não suportado: 3, pickle python2 não pode carregar o arquivo despejado por pickle python 3?

101

Eu uso pickle para despejar um arquivo no python 3 e uso pickle para carregar o arquivo no python 2, o ValueError aparece.

Então, python 2 pickle não pode carregar o arquivo despejado por python 3 pickle?

Se eu quiser? Como fazer?

Aleeee
fonte
5
Se você estiver preso a arquivos em conserva já gravados, verifique: stackoverflow.com/questions/34571063/…
rysqui

Respostas:

158

Você deve escrever os dados em conserva com um número de protocolo inferior no Python 3. O Python 3 introduziu um novo protocolo com o número 3(e o usa como padrão), então volte para um valor 2que possa ser lido pelo Python 2.

Verifique o protocolparâmetro em pickle.dump. Seu código resultante será semelhante a este.

pickle.dump(your_object, your_file, protocol=2)

Não há protocolparâmetro em pickle.loadporque picklepode determinar o protocolo do arquivo.

Matthias
fonte
54

Pickle usa diferentes protocolspara converter seus dados em um fluxo binário.

Você deve especificar em python 3 um protocolo inferior a 3para poder carregar os dados em python 2. Você pode especificar o protocolparâmetro ao invocar pickle.dump.

enrico.bacis
fonte
10
Apenas para referência futura, aparentemente há um protocolo 5que foi introduzido no Python 3.8 também que não é compatível com as versões anteriores.
Farzad Abdolhosseini
re: protocolo 5 python.org/dev/peps/pep-0574
Caleb Syring