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

Python Pickling - การสيريอาไลซ์และดีซีเรียลไลซ์ออบเจกต์

โมดูล pickle ของ Python ใช้สำหรับการ serialize และ de-serialize โครงสร้างออบเจกต์ Python กระบวนการแปลงออบเจกต์ Python ใดๆ (list, dict, ฯลฯ) เป็นไบต์สตรีม (0 และ 1) เรียกว่า pickling หรือ serialization หรือ flattening หรือ marshalling เราสามารถแปลงไบต์สตรีม (ที่สร้างผ่าน pickling) กลับเป็นออบเจกต์ Python ได้โดยกระบวนการที่เรียกว่า unpickling

ทำไมต้อง Pickle?: ในสถานการณ์จริง การใช้ pickling และ unpickling กว้างขวาง เนื่องจากมันช่วยให้เราโอนข้อมูลจากเซิร์ฟเวอร์/ระบบหนึ่งไปอีกตัวหนึ่งได้ง่าย และจัดเก็บในไฟล์หรือฐานข้อมูล

ข้อควรระวัง: ควรไม่ unpickle ข้อมูลที่ได้จากแหล่งที่ไม่เชื่อถือได้ เนื่องจากอาจเป็นภัยคุกคามความปลอดภัย อย่างไรก็ตาม โมดูล pickle ไม่มีวิธีรู้หรือเตือนขณะ pickling ข้อมูลอันตราย

เฉพาะหลังจากนำเข้าโมดูล pickle เราจึงสามารถทำ pickling และ unpickling ได้ การนำเข้า pickle สามารถทำได้ด้วยคำสั่ง:

import pickle

ตัวอย่าง Pickle:

ด้านล่างคือโปรแกรมง่ายๆ วิธี pickle ลิสต์:

Pickle ลิสต์ธรรมดา: Pickle_list1.py

import pickle
mylist = ['a', 'b', 'c', 'd']
with open('datafile.txt', 'wb') as fh:
    pickle.dump(mylist, fh)

ในโค้ดข้างต้น ลิสต์ "mylist" มี 4 องค์ประกอบ ('a', 'b', 'c', 'd') เราเปิดไฟล์ในโหมด "wb" แทน "w" เนื่องจากการดำเนินการทั้งหมดทำโดยใช้ไบต์ในไดเรกทอรีทำงานปัจจุบัน ไฟล์ใหม่ชื่อ "datafile.txt" ถูกสร้าง ซึ่งแปลงข้อมูล mylist เป็นไบต์สตรีม

Unpickle ลิสต์ธรรมดา: unpickle_list1.py

import pickle
pickle_off = open("datafile.txt", "rb")
emp = pickle.load(pickle_off)
print(emp)

ผลลัพธ์: เมื่อรันสคริปต์ข้างต้น คุณจะเห็นข้อมูล mylist อีกครั้งเป็นเอาต์พุท

['a', 'b', 'c', 'd']

Pickle ดิกชันนารีธรรมดา:

import pickle
EmpID = {1: "Zack", 2: "53050", 3: "IT", 4: "38", 5: "Flipkart"}
pickling_on = open("EmpID.pickle", "wb")
pickle.dump(EmpID, pickling_on)
pickling_on.close()

Unpickle ดิกชันนารี:

import pickle
pickle_off = open("EmpID.pickle", 'rb')
EmpID = pickle.load(pickle_off)
print(EmpID)

เมื่อรันสคริปต์ข้างต้น (unpickle) เราได้ดิกชันนารีกลับมาเหมือนที่เราเริ่มต้น ตัวอย่างเช่น โปรดทราบว่าเนื่องจากเราอ่านไบต์ที่นี่ เราจึงใช้ "rb" แทน "r"

ผลลัพธ์

{1: 'Zack', 2: '53050', 3: 'IT', 4: '38', 5: 'Flipkart'}

ข้อยกเว้นของ Pickle

ด้านล่างคือข้อยกเว้นทั่วไปบางอย่างที่เกิดขึ้นขณะจัดการกับโมดูล pickle:

  • Pickle.PicklingError: หากออบเจกต์ pickle ไม่รองรับ pickling ข้อยกเว้นนี้จะถูกยก
  • Pickle.UnpicklingError: ในกรณีที่ไฟล์มีข้อมูลเสียหรือเสียหาย
  • EOFError: ในกรณีที่ตรวจพบสิ้นสุดไฟล์ ข้อยกเว้นนี้จะถูกยก

ข้อดี:

  • สะดวกสำหรับบันทึกข้อมูลที่ซับซ้อน
  • ใช้ง่าย เบา และไม่ต้องการหลายบรรทัดของโค้ด
  • ไฟล์ pickled ที่สร้างขึ้นอ่านไม่ง่าย จึงให้ความปลอดภัยบางส่วน

ข้อเสีย:

  • ภาษาอื่นนอกจาก Python อาจไม่สามารถสร้างออบเจกต์ Python ที่ pickled กลับได้
  • ความเสี่ยงในการ unpickle ข้อมูลจากแหล่งร้าย