โมดูล 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 ข้อมูลจากแหล่งร้าย