ValueError: protokol acar tidak didukung: 3, acar python2 tidak dapat memuat file yang dibuang oleh acar python 3?

101

Saya menggunakan acar untuk membuang file di python 3, dan saya menggunakan acar untuk memuat file di python 2, ValueError muncul.

Jadi, acar python 2 tidak dapat memuat file yang dibuang oleh acar python 3?

Jika saya menginginkannya? Bagaimana melakukan?

Aleeee
sumber
5
Jika Anda terjebak dengan file acar yang sudah ditulis, periksa: stackoverflow.com/questions/34571063/…
rysqui

Jawaban:

158

Anda harus menulis data acar dengan nomor protokol yang lebih rendah di Python 3. Python 3 memperkenalkan protokol baru dengan nomor tersebut 3(dan menggunakannya sebagai default), jadi beralih kembali ke nilai2 yang dapat dibaca oleh Python 2.

Periksa protocolparameter di pickle.dump. Kode yang Anda hasilkan akan terlihat seperti ini.

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

Tidak ada protocolparameter masuk pickle.loadkarena pickledapat menentukan protokol dari file.

Matthias
sumber
54

Pickle menggunakan perbedaan protocolsuntuk mengubah data Anda menjadi aliran biner.

Anda harus menentukan dalam python 3 protokol yang lebih rendah dari 3untuk dapat memuat data di python 2. Anda dapat menentukan protocolparameter saat memanggil pickle.dump.

enrico.bacis
sumber
10
Hanya untuk referensi di masa mendatang, ternyata ada protokol 5yang juga diperkenalkan dengan Python 3.8 yang tidak kompatibel dengan versi sebelumnya.
Farzad Abdolhosseini
re: protocol 5 python.org/dev/peps/pep-0574
Jarum Suntik Kaleb