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

การทำให้เป็นอันดับอ็อบเจกต์ Python


การทำให้เป็นอนุกรมเป็นกระบวนการที่อ็อบเจ็กต์ถูกแปลงเป็นรูปแบบที่สามารถจัดเก็บ/บันทึกได้ (ในไฟล์หรือบัฟเฟอร์หน่วยความจำ) ดังนั้นเราจึงสามารถยกเลิกการซีเรียลไลซ์ในภายหลังและกู้คืนเนื้อหา/อ็อบเจ็กต์ดั้งเดิมจากรูปแบบซีเรียลไลซ์ได้ เราจะใช้โมดูล 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