Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การทำให้เป็นอันดับวัตถุ Python (Pickle)


คำว่า serialization ของอ็อบเจ็กต์หมายถึงกระบวนการแปลงสถานะของอ็อบเจ็กต์เป็นไบต์สตรีม เมื่อสร้างแล้ว ไบต์สตรีมนี้สามารถจัดเก็บเพิ่มเติมในไฟล์หรือส่งผ่านซ็อกเก็ต ฯลฯ ในทางกลับกัน การสร้างวัตถุจากสตรีมไบต์ขึ้นใหม่เรียกว่าดีซีเรียลไลเซชัน

ศัพท์เฉพาะของ Python สำหรับการทำให้เป็นอนุกรมและดีซีเรียลไลซ์เซชั่นคือการดองและการคลายออกตามลำดับ โมดูล pickle ที่มีอยู่ในไลบรารีมาตรฐานของ Python มีฟังก์ชันสำหรับ serialization (dump() และ dumps()) และ deserialization (load() และ loads())

โมดูล Pickle ใช้รูปแบบข้อมูลเฉพาะของ Python ดังนั้น โปรแกรมที่ไม่ได้เขียนด้วย Python อาจไม่สามารถทำการดีซีเรียลไลซ์ข้อมูลที่เข้ารหัส (ที่ถูกเลือก) ได้อย่างถูกต้อง นอกจากนี้ยังไม่ถือว่าปลอดภัยในการถอดรหัสข้อมูลจากแหล่งที่ไม่ผ่านการตรวจสอบสิทธิ์

โปรโตคอลดอง

โปรโตคอลเป็นแบบแผนที่ใช้ในการสร้างและแยกโครงสร้างอ็อบเจ็กต์ Python ไปยัง/จากข้อมูลไบนารี โมดูล pickle ปัจจุบันกำหนด 5 โปรโตคอลที่แตกต่างกันตามรายการด้านล่าง -

โปรโตคอลเวอร์ชัน 0 โปรโตคอลเดิมที่ "มนุษย์อ่านได้" ย้อนหลังได้กับเวอร์ชันก่อนหน้า
โปรโตคอลเวอร์ชัน 1 รูปแบบไบนารีแบบเก่ายังเข้ากันได้กับ Python เวอร์ชันก่อนหน้าด้วย
โปรโตคอลเวอร์ชัน 2 เปิดตัวใน Python 2.3 ให้การเลือกคลาสรูปแบบใหม่ที่มีประสิทธิภาพ
โปรโตคอลเวอร์ชัน 3 เพิ่มใน Python 3.0 แนะนำเมื่อต้องการความเข้ากันได้กับ Python 3 เวอร์ชันอื่น
โปรโตคอลเวอร์ชัน 4 ถูกเพิ่มใน Python 3.4.0 เพิ่มการรองรับวัตถุขนาดใหญ่มาก

หากต้องการทราบเวอร์ชันโปรโตคอลสูงสุดและดีฟอลต์ของการติดตั้ง Python ของคุณ ให้ใช้ค่าคงที่ที่กำหนดไว้ในโมดูล pickle

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

ดังที่กล่าวไว้ก่อนหน้านี้ ฟังก์ชัน dump() และ load() ของโมดูล pickle ทำการดองและดึงข้อมูล Python ฟังก์ชัน dump() เขียนวัตถุที่ดองลงในไฟล์ และฟังก์ชัน load() จะแยกข้อมูลจากไฟล์ไปยังวัตถุ Python

โปรแกรมต่อไปนี้จะดองวัตถุพจนานุกรมลงในไฟล์ไบนารี

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

เมื่อเรียกใช้โค้ดด้านบน การแสดงไบต์ของอ็อบเจ็กต์พจนานุกรมจะถูกเก็บไว้ในไฟล์ data.txt

ในการแกะหรือดีซีเรียลไลซ์ข้อมูลจากไฟล์ไบนารีกลับไปที่พจนานุกรม ให้รันโปรแกรมต่อไปนี้

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

คอนโซล Python แสดงวัตถุพจนานุกรมที่อ่านจากไฟล์

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

โมดูล pickle ยังประกอบด้วยฟังก์ชัน dumps() ที่ส่งคืนการแสดงสตริงของข้อมูลที่ดอง

>>> 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.'

ใช้ฟังก์ชัน loads() เพื่อคลายสตริงและรับออบเจกต์พจนานุกรมดั้งเดิม

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

โมดูล pickle ยังกำหนดคลาส Pickler และ Unpickler คลาส Pickler เขียนข้อมูลของ Pickler ลงในไฟล์ คลาส Unpickler อ่านข้อมูลไบนารีจากไฟล์และสร้างวัตถุ Python

การเขียนข้อมูลดองของวัตถุ 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()

วิธีอ่านข้อมูลย้อนหลังโดยคลายไฟล์ไบนารี

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

ออบเจ็กต์ของประเภทข้อมูลมาตรฐาน Python ทั้งหมดนั้นสามารถเลือกได้ นอกจากนี้ วัตถุของคลาสที่กำหนดเองยังสามารถดองและไม่ดองได้

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()

ไลบรารี Python ยังมีโมดูล marshal ที่ใช้สำหรับการทำให้เป็นอนุกรมภายในของอ็อบเจกต์ Python