ValueError: nieobsługiwany protokół pickle: 3, python2 pickle nie może załadować pliku zrzuconego przez python 3 pickle?

101

Używam pickle, aby zrzucić plik w Pythonie 3 i używam pickle, aby załadować plik na Pythonie 2, pojawia się ValueError.

Więc python 2 pickle nie może załadować pliku zrzuconego przez python 3 pickle?

Jeśli tego chcę? Jak zrobić?

Aleeee
źródło
5
Jeśli utkniesz z już zapisanymi wytrawionymi plikami, sprawdź: stackoverflow.com/questions/34571063/…
rysqui

Odpowiedzi:

158

Marynowane dane należy zapisać z niższym numerem protokołu w Pythonie 3. Python 3 wprowadził nowy protokół z numerem 3(i używa go jako domyślnego), więc przełącz się z powrotem na wartość, 2którą może odczytać Python 2.

Sprawdź protocolparametr w pickle.dump. Twój wynikowy kod będzie wyglądał następująco.

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

Nie ma protocolparametru, pickle.loadponieważ picklemożna określić protokół z pliku.

Matthias
źródło
54

Pickle używa różnych protocolsdo konwersji danych do strumienia binarnego.

Musisz określić w Pythonie 3 protokół niższy niż 3, aby móc załadować dane w Pythonie 2. Możesz określić protocolparametr podczas wywoływania pickle.dump.

enrico.bacis
źródło
10
Tylko dla przyszłego odniesienia, najwyraźniej istnieje protokół, 5który został również wprowadzony w Pythonie 3.8, który nie jest kompatybilny z wcześniejszymi wersjami.
Farzad Abdolhosseini
re: protokół 5 python.org/dev/peps/pep-0574
Caleb