Computer >> Máy Tính >  >> Lập trình >> Python

Tuần tự hóa đối tượng Python (Pickle)

Thuật ngữ tuần tự hóa đối tượng đề cập đến quá trình chuyển đổi trạng thái của một đối tượng thành luồng byte. Sau khi được tạo, luồng byte này có thể được lưu trữ thêm trong một tệp hoặc được truyền qua các ổ cắm, v.v. Mặt khác, việc tái tạo lại đối tượng từ luồng byte được gọi là giải mã hóa.

Thuật ngữ của Python cho tuần tự hóa và giải mã hóa tương ứng là chọn lọc và bỏ chọn. Mô-đun pickle có sẵn trong thư viện tiêu chuẩn của Python cung cấp các hàm để tuần tự hóa (dump () và dumps ()) và deserialization (tải () và tải ()).

Mô-đun dưa chua sử dụng định dạng dữ liệu rất cụ thể của Python. Do đó, các chương trình không được viết bằng Python có thể không thể giải mã dữ liệu được mã hóa (đã chọn) đúng cách. Ngoài ra, nó không được coi là an toàn khi bỏ chọn dữ liệu từ nguồn chưa được xác thực.

giao thức dưa

Giao thức là các quy ước được sử dụng để xây dựng và giải cấu trúc các đối tượng Python đến / từ dữ liệu nhị phân. Mô-đun dưa chua hiện tại xác định 5 giao thức khác nhau như được liệt kê bên dưới -

Phiên bản giao thức 0 Giao thức gốc "con người có thể đọc được" tương thích ngược với các phiên bản trước đó.
Phiên bản giao thức 1 Định dạng nhị phân cũ cũng tương thích với các phiên bản Python trước.
Giao thức phiên bản 2 Được giới thiệu trong Python 2.3 cung cấp khả năng chọn lọc hiệu quả các lớp kiểu mới.
Giao thức phiên bản 3 Đã thêm vào Python 3.0. được khuyến nghị khi cần có khả năng tương thích với các phiên bản Python 3 khác.
Phiên bản giao thức 4 đã được thêm vào Python 3.4. Nó bổ sung hỗ trợ cho các đối tượng rất lớn

Để biết phiên bản giao thức cao nhất và mặc định của cài đặt Python của bạn, hãy sử dụng các hằng số sau được xác định trong mô-đun pickle

>>> import pickle
>>> pickle.HIGHEST_PROTOCOL
4
>>> pickle.DEFAULT_PROTOCOL
3

Như đã đề cập trước đó, các hàm dump () và load () của mô-đun pickle thực hiện việc lấy và giải nén dữ liệu Python. Hàm dump () ghi đối tượng đã chọn vào một tệp và hàm load () giải nén dữ liệu từ tệp sang đối tượng Python.

Chương trình sau chọn một đối tượng từ điển thành một tệp nhị phân.

import pickle
f = open("data.txt","wb")
dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75}
pickle.dump(dct,f)
f.close()

Khi mã trên được thực thi, biểu diễn byte của đối tượng từ điển sẽ được lưu trữ trong tệp data.txt.

Để bỏ chọn hoặc giải mã dữ liệu từ tệp nhị phân trở lại từ điển, hãy chạy chương trình sau

import pickle
f = open("data.txt","rb")
d = pickle.load(f)
print (d)
f.close()

Bảng điều khiển Python hiển thị đối tượng từ điển được đọc từ tệp

{'age': 23, 'Gender': 'M', 'name': 'Ravi', 'marks': 75}

Mô-đun pickle cũng bao gồm hàm dumps () trả về một biểu diễn chuỗi của dữ liệu đã ngâm.

>>> from pickle import dump
>>> dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75}
>>> dctstring = dumps(dct)
>>> dctstring
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.'

Sử dụng hàm load () để bỏ chọn chuỗi và lấy đối tượng từ điển ban đầu.

>>> from pickle import load
>>> dct = loads(dctstring)
>>> dct
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}

Mô-đun pickle cũng định nghĩa các lớp Pickler và Unpickler. Lớp Pickler ghi dữ liệu pickle vào tệp. Lớp Unpickler đọc dữ liệu nhị phân từ tệp và tạo đối tượng Python

Để viết dữ liệu đã chọn của đối tượng Python

from pickle import pickler
f = open("data.txt","wb")
dct = {'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
Pickler(f).dump(dct)
f.close()

Để đọc lại dữ liệu bằng cách giải nén tệp nhị phân

from pickle import Unpickler
f = open("data.txt","rb")
dct = Unpickler(f).load()
print (dct)
f.close()

Đối tượng của tất cả các kiểu dữ liệu chuẩn Python đều có thể chọn được. Hơn nữa, các đối tượng của lớp tùy chỉnh cũng có thể được chọn và bỏ chọn.

from pickle import *
class person:
def __init__(self):
self.name = "XYZ"
self.age = 22
def show(self):
print ("name:", self.name, "age:", self.age)
p1 = person()
f = open("data.txt","wb")
dump(p1,f)
f.close()
print ("unpickled")
f = open("data.txt","rb")
p1 = load(f)
p1.show()

Thư viện Python cũng có mô-đun nguyên soái được sử dụng để tuần tự hóa nội bộ của các đối tượng Python.