Khóa học Phát triển Python Nâng cao
Chương
>
Cấp độ

Các mô-đun tuần tự hóa
Các module Marshal và Pickle

Mục tiêu

Đi đến trạm dịch vụ và đảm bảo dữ liệu được lưu trữ đúng cách bằng cách sử dụng module JSON để định dạng tệp.

Tiếp tục dọc theo đường dẫn, chúng ta sẽ tìm thấy vài trạm giám sát phân phối nước và chất lượng đất cho vùng đất đang được phát triển cho vụ thu hoạch trong tương lai. Để xử lý dữ liệu, việc tuần tự hóa dữ liệu là hiệu quả. Mặc dù việc sử dụng JSON có thể hiệu quả như một giải pháp tổng quát, cũng có một vài phương pháp tuần tự hóa đặc thù Python, đó là các module Marshal và Pickle. Module Marshal được thiết kế để tuần tự hóa/giải tuần tự hóa nhanh bằng cách chuyển dữ liệu sang dạng nhị phân, lý tưởng cho các truyền dữ liệu đơn giản. Module Pickle chậm hơn nhưng được thiết kế để xử lý cấu trúc dữ liệu phức tạp hơn và linh hoạt hơn nhiều, lý tưởng cho các cấu trúc dữ liệu lớn hoặc ưu tiên.

Để sử dụng các module Marshal và Pickle, hãy import các hàm của chúng bằng cách viết: import marshalimport pickle. Cho mục đích của chúng ta, chúng ta sẽ sử dụng các hàm sau:

  • marshal.dumps(): Tuần tự hóa dữ liệu thành định dạng nhị phân, được thiết kế để chạy nhanh trong Python. Nhận một đối số, đó là dữ liệu bạn muốn tuần tự hóa, giới hạn với các kiểu dữ liệu cơ bản.
  • marshal.loads(): Giải tuần tự hóa dữ liệu nhị phân thành các kiểu dữ liệu có thể đọc được trong Python, hạn chế về khả năng nhưng thực thi nhanh. Nhận một đối số, đó là dữ liệu để giải tuần tự hóa.
  • pickle.DEFAULT_PROTOCOL: Kiểm tra phiên bản protocol mặc định cho việc tuần tự hóa Pickle trong phiên bản Python của bạn. Các protocol ảnh hưởng đến cách dữ liệu được tuần tự hóa.
  • pickle.HIGHEST_PROTOCOL: Kiểm tra phiên bản protocol cao nhất hiện có cho việc tuần tự hóa Pickle trong phiên bản Python của bạn. Các protocol ảnh hưởng đến cách dữ liệu được tuần tự hóa.
  • pickle.dumps(): Tuần tự hóa các cấu trúc dữ liệu Python phức tạp thành định dạng nhị phân theo protocol được sử dụng. Nhận hai đối số, dữ liệu bạn muốn tuần tự hóa và phiên bản protocol bạn muốn sử dụng khi tuần tự hóa.
  • pickle.loads(): Giải tuần tự hóa dữ liệu nhị phân thành các kiểu dữ liệu có thể đọc được trong Python, mạnh mẽ cho các đối tượng Python. Nhận một đối số, đó là dữ liệu bạn muốn giải tuần tự hóa.

Bên cạnh những module và hàm này, chúng ta cũng sẽ sử dụng một module định dạng tên là pformat, mà chúng ta sẽ import bằng from pprint import pformat. Điều này cho phép chúng ta sử dụng hàm pformat() để định dạng các cấu trúc dữ liệu như dictionary, giúp hiển thị thông tin một cách rõ ràng.

Để bắt đầu, đi đến dấu X ánh sáng bên trong trạm giám sát nhỏ và đối diện với terminal máy tính. Trạm giám sát áp suất nước và điều kiện đất của vùng lân cận đang được phát triển để trồng cây. Có một hằng số tên là reading, chứa dữ liệu Python được trạm thu thập.

Tạo một biến tên là data và gán giá trị kết quả của hàm marshal.dumps() với reading làm đối số. Ví dụ: data = marshal.dumps(reading). Sử dụng biến data với hàm display() được viết sẵn để xem dữ liệu biến đã được tuần tự hóa.

Đi ra khỏi trạm và hướng tới dấu X màu vàng, sử dụng hàm open() để mở cửa và vào văn phòng. Đi đến dấu X ánh sáng trước terminal, và giải tuần tự hóa dữ liệu bạn vừa tuần tự hóa. Tạo một biến tên là output và gán giá trị kết quả của marshal.loads() với biến data trước đó làm đối số. Sử dụng hàm write() và thêm output làm đối số để truy cập dữ liệu đã được thu thập từ trạm giám sát.

Đi đến dấu X ánh sáng trên thảm xanh trong văn phòng, tại terminal chúng ta sẽ xác minh các protocol để xác định module pickle sẽ sử dụng loại tuần tự hóa nào khi xử lý dữ liệu. Trong hàm write() được viết sẵn, đặt các đối số là pickle.DEFAULT_PROTOCOLpickle.HIGHEST_PROTOCOL. Điều này sẽ xác minh protocol tuần tự hóa hiện tại là gì cũng như protocol tuần tự hóa mới nhất hiện có.

Tiếp tục đến dấu X tối trên thảm xanh, giờ chúng ta đã xác nhận các protocol, chúng ta có thể xác minh dữ liệu đã được lưu. Dữ liệu đã được thu thập và lưu trữ trong nhiều tháng và được lưu trong một hằng số tên là samples. Tạo ba biến tên: sereal_0, sereal_2sereal_5, chúng ta sẽ sử dụng các biến này để xác minh ba protocol có sẵn cho việc tuần tự hóa. Protocol 0 là ASCII có thể đọc được, không hiệu quả lắm; Protocol 2 là định dạng nhị phân hiệu quả hơn; và Protocol 5 là mới nhất với các tính năng phức tạp nhất.

Chúng ta sẽ gán giá trị của pickle.dumps() với các đối số là hằng số samplesprotocol tương ứng với số trong tên biến. Ví dụ, với sereal_0 chúng ta sẽ đặt protocol0, như sau: sereal_0 = pickle.dumps(samples, protocol=0). Sử dụng sereal_0, sereal_2sereal_5 với hàm display() được viết sẵn để xác minh sự khác biệt của việc tuần tự hóa cho mỗi protocol.

Đi đến dấu X ánh sáng trên thảm đỏ và đối diện terminal, ghi đè biến output và gán giá trị của pickle.loads() với đối số là sereal_5 để giải tuần tự hóa dữ liệu mẫu đã được thu thập cho đến nay. Sử dụng hàm display() và thêm hàm pformat() với biến output để xem dữ liệu. Ví dụ: await player.display(pformat(output)). Ghi chú lại các đánh giá cho từng tháng hiển thị trong terminal để sau này bạn có thể vẽ biểu đồ.

Đi đến dấu X tối trên thảm đỏ và đối diện bàn làm việc, trong hàm write() được viết sẵn, thêm các đánh giá bạn đã ghi chú cho từng tháng, những đánh giá đã được hiển thị trong terminal trước đó. Thêm chúng dưới dạng chuỗi với dấu "" theo đúng thứ tự như đã chỉ ra trong hàm để hoàn thành cấp độ.

Sách Mã