CodeGym /Khóa học Java /Python SELF VI /Làm việc với pickle

Làm việc với pickle

Python SELF VI
Mức độ , Bài học
Có sẵn

9.1 Làm quen với pickle

Mô-đun pickle cho phép lưu trữ hầu như bất kỳ đối tượng Python nào vào file hoặc chuỗi, sau đó khôi phục nó trở lại trạng thái ban đầu. pickle hỗ trợ nhiều loại dữ liệu, bao gồm cả đối tượng tự định nghĩa, và tự động hóa việc chuyển đổi đối tượng sang định dạng byte và ngược lại.

Các hàm chính của mô-đun pickle

  • Đọc và ghi đối tượng vào file
    • pickle.dump(obj, file): Chuyển đối tượng obj và ghi nó vào file mở file.
    • pickle.load(file): Đọc từ file file và nạp lại đối tượng.
  • Đọc và ghi đối tượng vào mảng byte
    • pickle.dumps(obj): Chuyển đổi đối tượng obj và trả về nó dưới dạng đối tượng byte.
    • pickle.loads(bytes): Khôi phục đối tượng từ đối tượng byte.

Dưới đây chúng ta sẽ xem xét chúng chi tiết hơn một chút:

9.2 Số hóa vào file

Các bước chính để số hóa vào file:

  1. Mở file ở chế độ ghi byte (wb).
  2. Số hóa đối tượng bằng cách sử dụng pickle.dump(obj, file).
  3. Để khôi phục đối tượng, sử dụng pickle.load(file).
  4. Đóng file.

Số hóa và khôi phục đối tượng vào file

Theo nguyên tắc, pickle không quan tâm đối tượng gì số hóa. Ví dụ, số hóa một danh sách trông như thế này:


import pickle

data = [1, 2, 3, 4, 5]
            
# Số hóa danh sách vào file
with open('list.pkl', 'wb') as file:
    pickle.dump(data, file)
            
# Khôi phục danh sách từ file
with open('list.pkl', 'rb') as file:
    loaded_data = pickle.load(file)
            
print(loaded_data)  # Kết quả: [1, 2, 3, 4, 5]

Đây là cách số hóa đối tượng dictionary:


import pickle

# Ví dụ đối tượng để số hóa
data = {'name': 'Alice', 'age': 30, 'is_student': False}
            
# Số hóa đối tượng vào file
with open('data.pkl', 'wb') as file:
    pickle.dump(data, file)
            
# Khôi phục đối tượng từ file
with open('data.pkl', 'rb') as file:
    loaded_data = pickle.load(file)
            
print(loaded_data)  # Kết quả: {'name': 'Alice', 'age': 30, 'is_student': False}

Muốn lưu trữ đối tượng — gọi dump(), muốn tải về — gọi load(). Dễ mà.

9.3 Số hóa vào chuỗi

Rất thường xuyên, đối tượng cần phải được truyền qua mạng, vì vậy cần lưu trữ đối tượng không phải vào file, mà vào chuỗi. pickle có các phương thức dumpsloads với một s ở cuối.

Các hành động chính để số hóa và khôi phục vào chuỗi (hoặc mảng byte):

  • Số hóa đối tượng bằng cách sử dụng pickle.dumps(obj).
  • Để khôi phục đối tượng, sử dụng pickle.loads(data).

Số hóa và khôi phục đối tượng vào chuỗi

Số hóa đối tượng vào chuỗi (hoặc tập hợp byte) còn dễ hơn — chỉ cần gọi một phương thức — dumps().

Ví dụ:


import pickle

# Ví dụ đối tượng để số hóa
data = {'name': 'Bob', 'age': 25, 'is_student': True}
            
# Số hóa đối tượng vào chuỗi
serialized_data = pickle.dumps(data)
print(serialized_data)
            
# Khôi phục đối tượng từ chuỗi
loaded_data = pickle.loads(serialized_data)
print(loaded_data)  # Kết quả: {'name': 'Bob', 'age': 25, 'is_student': True}

9.4 Lỗi khi số hóa

Đôi khi khi số hóa sẽ phát sinh lỗi. Trong trường hợp này, mô-đun pickle sẽ ném ra ngoại lệ:

  • pickle.PicklingError — lỗi trong quá trình số hóa.
  • pickle.UnpicklingError — lỗi trong quá trình khôi phục.

Ví dụ:


import pickle

data = {'key': 'value'}
            
try:
    # Số hóa đối tượng vào file
    with open('data.pkl', 'wb') as file:
        pickle.dump(data, file)
except pickle.PicklingError as e:
    print(f"Lỗi số hóa: {e}")
            
try:
    # Khôi phục đối tượng từ file
    with open('data.pkl', 'rb') as file:
        loaded_data = pickle.load(file)
    print(loaded_data)
except pickle.UnpicklingError as e:
    print(f"Lỗi khôi phục: {e}")

Thường thì bạn như lập trình viên không thể làm gì với lỗi số hóa/khôi phục khi chương trình đang chạy. Tất cả những gì bạn có thể — là lưu nó vào log, để sau này tìm hiểu tại sao lại xảy ra lỗi.

Nguyên nhân chính của các lỗi như vậy — là thay đổi định dạng đối tượng. Bạn lưu trữ đối tượng vào file, sau đó chương trình của bạn được cập nhật, và đối tượng có thêm trường mới hoặc mất đi trường cũ. Và giờ đây đối tượng cũ được lưu trữ cố gắng khởi tạo trong lớp đối tượng mới...

Lại một lần nữa, tình huống này thường gặp khi làm việc với mạng — chương trình phiên bản 2.18 gửi đi đối tượng hơi khác so với chương trình phiên bản 3.1 mong đợi. Đây được gọi là vấn đề di chuyển, và nó thường xuyên gặp trong các dự án lâu dài và phổ biến.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION