การทำให้เป็นอนุกรมเป็นกระบวนการที่อ็อบเจ็กต์ถูกแปลงเป็นรูปแบบที่สามารถจัดเก็บ/บันทึกได้ (ในไฟล์หรือบัฟเฟอร์หน่วยความจำ) ดังนั้นเราจึงสามารถยกเลิกการซีเรียลไลซ์ในภายหลังและกู้คืนเนื้อหา/อ็อบเจ็กต์ดั้งเดิมจากรูปแบบซีเรียลไลซ์ได้ เราจะใช้โมดูล python pickle เพื่อดำเนินการทั้งหมดนี้
การดองคืออะไร
โมดูล Python pickle ใช้สำหรับการทำให้เป็นอนุกรมและยกเลิกการจัดลำดับโครงสร้างอ็อบเจ็กต์ python กระบวนการในการแปลงอ็อบเจ็กต์หลาม (รายการ dict ฯลฯ) เป็นไบต์สตรีม (0 และ 1 วินาที) เรียกว่าการดองหรือการทำให้เป็นอนุกรมหรือการทำให้แบนราบหรือการรวมกลุ่ม เราสามารถแปลงสตรีมไบต์ (สร้างผ่านการดอง) กลับเป็นอ็อบเจ็กต์หลามโดยกระบวนการที่เรียกว่าการคลายไฟล์
ในการดองวัตถุ เราต้อง −
- นำเข้าผักดอง
- เรียกฟังก์ชัน dumps()
import pickle class Vehicle: def __init__(self, number_of_doors, color): self.number_of_doors = number_of_doors self.color = color class Car(Vehicle): def __init__(self, color): Vehicle.__init__(self, 5, color) Maruti = Car('Red') print(str.format('My Vehicle Maruti is {0} and has {1} doors', Maruti.color, Maruti.number_of_doors)) pickle_Maruti = pickle.dumps(Maruti) print('Here is my pickled Vehicle: ') print(pickle_Maruti)
ผลลัพธ์
My Vehicle Maruti is Red and has 5 doors Here is my pickled Vehicle: b'\x80\x03c__main__\nCar\nq\x00)\x81q\x01}q\x02(X\x0f\x00\x00\x00number_of_doorsq\x03K\x05X\x05\x00\x00\x00colorq\x04X\x03\x00\x00\x00Redq\x05ub.'
ในตัวอย่างข้างต้น เราได้สร้างอินสแตนซ์ของคลาสรถแล้วจึงเลือกมัน โดยเปลี่ยนอินสแตนซ์รถของเราเป็นอาร์เรย์ไบต์อย่างง่าย หลังจากที่อินสแตนซ์รถของเราถูกดอง เราสามารถเก็บไว้ในไฟล์ไบนารีหรือในฟิลด์ db ได้อย่างง่ายดาย และกู้คืนในภายหลังเพื่อแปลงกลับกลุ่มของไบต์นี้ในลำดับชั้นของวัตถุ
หมายเหตุ:ในกรณีที่เราต้องการสร้างไฟล์ที่มีวัตถุดอง เราจำเป็นต้องใช้เมธอด dump() แทนเมธอด dumps()
หลุด
เป็นการดำเนินการผกผัน (หรือการดอง) ซึ่งเราใช้ไบนารีสตรีมและแปลงเป็นลำดับชั้นของวัตถุ
การ unpickling ทำได้โดยใช้ฟังก์ชัน load() ของโมดูล pickle และส่งคืนลำดับชั้นของอ็อบเจ็กต์ทั้งหมดจากสตรีมไบต์
ข้างล่างนี้เป็นโหลด
import pickle class Vehicle: def __init__(self, number_of_doors, color): self.number_of_doors = number_of_doors self.color = color class Car(Vehicle): def __init__(self, color): Vehicle.__init__(self, 5, color) Maruti = Car('Red') print(str.format('My Vehicle Maruti is {0} and has {1} doors', Maruti.color, Maruti.number_of_doors)) pickle_Maruti = pickle.dumps(Maruti) #Now, let's unpickle our car Maruti creating another instance, another car ... unpickle_Maruti Hyundai = pickle.loads(pickle_Maruti) #Set another color of our new instance Hyundai.color = 'Black' print(str.format("Hyundai is {0} ", Hyundai.color)) print(str.format("Maruti is {0} ", Maruti.color))
ในตัวอย่างด้านบน คุณจะเห็นว่าเราได้ดองวัตถุรถยนต์คันแรกของเรา (Maruti) แล้วเราก็แกะมันออกมาเป็นตัวแปรอื่น (Hyundai) ดังนั้นเราจึงมีความรู้สึก - โคลน Maruti เพื่อสร้าง Hyundai
ผลลัพธ์
My Vehicle Maruti is Red and has 5 doors Hyundai is Black Maruti is Red
Pickle เทียบกับ JSON
JSON ย่อมาจาก Javascript Object Notation เป็นรูปแบบน้ำหนักเบาสำหรับการแลกเปลี่ยนข้อมูลและมนุษย์สามารถอ่านได้ ข้อได้เปรียบที่สำคัญอย่างหนึ่งของ JSON เหนือการดองคือเป็นมาตรฐานและไม่ขึ้นกับภาษา ปลอดภัยและเร็วกว่าดองมาก
อีกทางเลือกหนึ่งสำหรับ pickle คือ cPickle ซึ่งคล้ายกับ pickle แต่เขียนด้วยภาษา C และเร็วกว่า 1,000 เท่า คุณสามารถใช้ไฟล์เดียวกันสำหรับ pickle และ cPickle ได้
import json mylist = [2, 4, 5, "ab", "cd", "ef"] print("Here is my list: ", mylist) json_string = json.dumps(mylist ) print("Here is my json encoded object: ", json_string) print ("Here is JSON back to a data structure: ",json.loads(json_string))
ผลลัพธ์
Here is my list: [2, 4, 5, 'ab', 'cd', 'ef'] Here is my json encoded object: [2, 4, 5, "ab", "cd", "ef"] Here is JSON back to a data structure: [2, 4, 5, 'ab', 'cd', 'ef']
ในโค้ดด้านบนนี้ ก่อนอื่นเราใช้อ็อบเจกต์ (รายการของฉัน) และใช้เมธอด "dumps" เพื่อส่งคืนสตริง จากนั้นจึงโหลด JSON กลับไปที่โครงสร้างข้อมูล เราใช้วิธี "โหลด" ที่เปลี่ยนสตริงและเปลี่ยนเป็น โครงสร้างข้อมูลออบเจ็กต์ JSON