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ượngobj
và ghi nó vào file mởfile
. -
pickle.load(file)
: Đọc từ filefile
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ượngobj
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:
-
Mở file ở chế độ ghi byte
(wb)
. -
Số hóa đối tượng bằng cách sử dụng
pickle.dump(obj, file)
. -
Để khôi phục đối tượng, sử dụng
pickle.load(file)
. - Đó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
dumps
và loads
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.
GO TO FULL VERSION