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
Hãy đến trạm dịch vụ và đảm bảo rằng 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 trên con đường, chúng ta sẽ gặp một vài trạm giám sát việc 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 sắp tới. Để xử lý dữ liệu, việc tuần tự hóa dữ liệu là rất hiệu quả. Trong khi việc sử dụng Json có thể là một giải pháp tổng quát hiệu quả, cũng có một vài phương pháp tuần tự hóa đặc thù của Python, đó là các module Marshal và Pickle. Module Marshal được thiết kế cho việc tuần tự hóa/phi tuần tự hóa nhanh bằng cách chuyển dữ liệu thành dạng nhị phân, lý tưởng cho các chuyển giao dữ liệu đơn giản. Module Pickle chậm hơn nhưng được thiết kế để xử lý các cấu trúc dữ liệu phức tạp hơn và linh hoạt hơn rất nhiều, lý tưởng cho các cấu trúc dữ liệu lớn hoặc có độ ưu tiên cao.
Để sử dụng các module Marshal và Pickle, nhập các hàm của chúng bằng cách viết: import marshal và import pickle. Trong 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 vào một đối số, đó là dữ liệu bạn muốn tuần tự hóa, giới hạn ở các kiểu dữ liệu cơ bản.marshal.loads(): Phi tuần tự hóa dữ liệu nhị phân thành các kiểu dữ liệu mà Python có thể đọc được, có khả năng hạn chế nhưng thực thi nhanh. Nhận vào một đối số, đó là dữ liệu cần phi tuần tự hóa.pickle.DEFAULT_PROTOCOL: Kiểm tra phiên bản giao thức mặc định cho việc tuần tự hóa của Pickle trong phiên bản Python của bạn. Các giao thức ả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 giao thức cao nhất có sẵn cho việc tuần tự hóa của Pickle trong phiên bản Python của bạn. Các giao thức ả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 giao thức được sử dụng. Nhận vào hai đối số, dữ liệu bạn muốn tuần tự hóa và phiên bản giao thức bạn muốn sử dụng khi tuần tự hóa.pickle.loads(): Phi tuần tự hóa dữ liệu nhị phân thành các kiểu dữ liệu Python có thể đọc được, mạnh mẽ trong việc xử lý các đối tượng Python. Nhận vào một đối số, đó là dữ liệu bạn muốn phi tuần tự hóa.
Ngoài những module và hàm này, chúng ta cũng sẽ sử dụng một module định dạng có tên pformat, mà chúng ta sẽ nhập bằng cách sử dụ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ư từ điển, cho phép chúng ta hiển thị thông tin một cách rõ ràng.
Để bắt đầu, hãy đi đến dấu hiệu X ánh sáng bên trong trạm giám sát nhỏ và hướng về phía bàn tính toán. Trạm này giám sát áp suất nước và điều kiện đất của vùng địa hình 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 thu thập bởi trạm.
Tạo một biến có tên data và gán giá trị bằng hàm marshal.dumps() với đối số là reading. Như sau: data = marshal.dumps(reading). Sử dụng biến data cùng với hàm display() đã được viết sẵn để xem dữ liệu biến đã tuần tự hóa.
Hãy ra khỏi trạm và hướng đến dấu hiệu X vàng, sử dụng hàm open() để mở cửa và truy cập vào văn phòng. Đi đến dấu hiệu X ánh sáng trước bàn tính toán, và phi tuần tự hóa dữ liệu mà bạn vừa tuần tự hóa. Tạo một biến có tên output và gán giá trị bằng hàm 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 tuần tự hóa mà bạn đã thu thập từ trạm giám sát.
Hãy đi đến dấu hiệu X ánh sáng trên thảm màu xanh dương trong văn phòng, trên bàn tính toán chúng ta sẽ xác minh các giao thức để xác định loại tuần tự hóa mà module Pickle sẽ sử dụng khi xử lý dữ liệu. Trong hàm write() đã được viết sẵn, đặt các đối số là pickle.DEFAULT_PROTOCOL và pickle.HIGHEST_PROTOCOL. Điều này sẽ xác minh giao thức tuần tự hóa hiện tại cũng như giao thức tuần tự hóa mới nhất có sẵn vào thời điểm này.
Tiếp theo, đi đến dấu hiệu X tối trên thảm màu xanh dương, bây giờ khi chúng ta đã xác nhận các giao thức, chúng ta có thể xác minh dữ liệu được lưu trữ. Dữ liệu đã được thu thập và lưu trữ trong suốt nhiều tháng và được lưu trong một hằng số tên là samples. Tạo ba biến có tên: sereal_0, sereal_2 và sereal_5; chúng ta sẽ sử dụng chúng để xác minh ba giao thức tuần tự hóa có sẵn. Giao thức 0 là ASCII có thể đọc được, không hiệu quả lắm, giao thức 2 là định dạng nhị phân hiệu quả hơn và giao thức 5 là giao thức mới nhất với các tính năng phức tạp nhất đã được thêm.
Chúng ta sẽ gán giá trị của pickle.dumps() và đặt các đối số là hằng số samples và protocol tương ứng với số trong tên biến. Ví dụ, đối với sereal_0 chúng ta sẽ đặt protocol là 0, như sau: sereal_0 = pickle.dumps(samples, protocol=0). Sử dụng các biến sereal_0, sereal_2 và sereal_5 cùng với hàm display() đã được viết sẵn để xác minh cách tuần tự hóa khác nhau cho mỗi giao thức.
Đi đến dấu hiệu X ánh sáng trên thảm màu đỏ và hướng về bàn tính toán, ghi đè biến output và gán giá trị của pickle.loads() với đối số là sereal_5 để phi 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. Như sau: await player.display(pformat(output)). Lưu ý các xếp hạng cho mỗi tháng được hiển thị trên bàn tính toán để bạn có thể ghi chúng lại sau này.
Đi đến dấu hiệu X tối trên thảm màu đỏ và hướng về bàn làm việc, trên hàm write() đã được viết sẵn, thêm các xếp hạng mà bạn đã ghi chú cho mỗi tháng, được hiển thị trước đó trên bàn tính toán. Thêm chúng dưới dạng chuỗi với dấu "" theo đúng thứ tự như được sắp xếp trong hàm để hoàn thành cấp độ.