Tôi sử dụng pickle để kết xuất tệp trên python 3 và tôi sử dụng pickle để tải tệp trên python 2, ValueError xuất hiện.
Vì vậy, python 2 dưa chua không thể tải tệp do python 3 dưa chua?
Nếu tôi muốn nó? Làm như thế nào?
Tôi sử dụng pickle để kết xuất tệp trên python 3 và tôi sử dụng pickle để tải tệp trên python 2, ValueError xuất hiện.
Vì vậy, python 2 dưa chua không thể tải tệp do python 3 dưa chua?
Nếu tôi muốn nó? Làm như thế nào?
Câu trả lời:
Bạn nên viết dữ liệu đã chọn với số giao thức thấp hơn bằng Python 3. Python 3 đã giới thiệu một giao thức mới với số 3(và sử dụng nó làm mặc định), vì vậy hãy chuyển về một giá trị 2mà Python 2 có thể đọc được.
Kiểm tra protocolthông số trong pickle.dump. Mã kết quả của bạn sẽ giống như thế này.
pickle.dump(your_object, your_file, protocol=2)
Không có protocoltham số trong pickle.loadvì picklecó thể xác định giao thức từ tệp.
Pickle sử dụng khác nhau protocolsđể chuyển đổi dữ liệu của bạn thành một luồng nhị phân.
Trong python 2 có 3 giao thức khác nhau ( 0, 1, 2) và mặc định là 0.
Trong python 3 có 5 giao thức khác nhau ( 0, 1, 2, 3, 4) và mặc định là 3.
Bạn phải chỉ định trong python 3 một giao thức thấp hơn 3để có thể tải dữ liệu trong python 2. Bạn có thể chỉ định protocoltham số khi gọi pickle.dump.
5đã được giới thiệu trong Python 3.8 cũng không tương thích với các phiên bản trước đó.