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

การบีบอัดโดยใช้อัลกอริทึม LZMA โดยใช้ Python (lzma)


อัลกอริธึมลูกโซ่ Lempel–Ziv–Markov (LZMA) ทำการบีบอัดข้อมูลโดยไม่สูญเสียข้อมูลโดยใช้รูปแบบการบีบอัดพจนานุกรมที่มีอัตราส่วนการบีบอัดที่สูงกว่าอัลกอริธึมการบีบอัดอื่นๆ โมดูล lzma ของ Python ประกอบด้วยคลาสและฟังก์ชันอำนวยความสะดวกสำหรับการบีบอัดและคลายการบีบอัดข้อมูลด้วยอัลกอริธึม LZMA

แม้ว่าฟังก์ชันการทำงานในโมดูลนี้จะคล้ายกับโมดูล bz2 แต่คลาส LZMAFile นั้นไม่ปลอดภัยสำหรับเธรดเมื่อเปรียบเทียบกับคลาส BZ2File

ที่นี่อีกครั้ง ฟังก์ชัน open() ในโมดูล lzma เป็นวิธีที่ง่ายที่สุดในการเปิดวัตถุไฟล์ที่บีบอัดด้วย lzma

เปิด()

ฟังก์ชันนี้เปิดไฟล์บีบอัด LZMA และส่งคืนอ็อบเจ็กต์ไฟล์ ฟังก์ชันนี้ต้องการพารามิเตอร์หลัก 2 ตัว ได้แก่ ชื่อไฟล์และโหมด พารามิเตอร์โหมดเป็นค่าเริ่มต้น "rb" แต่สามารถรับค่าใดค่าหนึ่งต่อไปนี้ได้

binary mode - "r", "rb", "w", "wb", "x", "xb", "a" or "ab"
text mode - "rt", "wt", "xt", or "at"

บีบอัด()

ฟังก์ชันนี้บีบอัดข้อมูลที่กำหนดโดยใช้อัลกอริทึม LZMA และส่งคืนอ็อบเจ็กต์ไบต์ ฟังก์ชันนี้สามารถเลือกที่จะมีอาร์กิวเมนต์รูปแบบที่กำหนดรูปแบบคอนเทนเนอร์ได้ ค่าที่เป็นไปได้คือ FORMAT_XZ (ค่าเริ่มต้น) และ FORMAT_ALONE

แตกไฟล์()

ฟังก์ชันนี้จะคลายการบีบอัดข้อมูลและส่งคืนอ็อบเจ็กต์ไบต์ที่ไม่บีบอัด

ฟังก์ชันข้างต้นใช้ในตัวอย่างต่อไปนี้ ในการเขียนข้อมูลที่บีบอัด LZMA ลงในไฟล์

>>> import lzma
>>> data = b"Welcome to TutorialsPoint"
>>> f = lzma.open("test.xz","wb")
>>>f.write(data)
>>>f.close()

ไฟล์ 'test.xz' จะถูกสร้างขึ้นในไดเร็กทอรีการทำงานปัจจุบัน หากต้องการดึงข้อมูลที่ไม่บีบอัดจากไฟล์นี้ ให้ใช้รหัสต่อไปนี้

>>> import lzma
>>> f = lzma.open("test.xz","rb")
>>> data = f.read()
>>> data
b'Welcome to TutorialsPoint'

เพื่อทำการบีบอัดโดยใช้ API เชิงวัตถุของโมดูล lzma เราต้องใช้คลาส LZMAFile

LZMAFile()

นี่คือตัวสร้างสำหรับคลาส LZMAFile ต้องระบุไฟล์และโหมด ออบเจ็กต์ที่มีโหมด 'w' หรือ 'wb' ทำให้เมธอด write() ใช้งานได้

เขียน()

วิธีนี้จะบีบอัดข้อมูลที่กำหนดและเขียนลงในไฟล์ด้านล่าง

>>> data = b'Welcome to TutorialsPoint'
>>>obj = lzma.LZMAFile("test.xz", mode="wb")
>>>obj.write(data)
>>>obj.close()

ไฟล์ที่บีบอัดถูกอ่านและข้อมูลที่ไม่ถูกบีบอัดจะถูกเรียกขึ้นมาใหม่โดยเมธอด read() ของอ็อบเจกต์ LZMAFile ที่สร้างด้วยพารามิเตอร์ mode='rb'

อ่าน()

เมธอดนี้จะอ่านข้อมูลจากไฟล์บีบอัดและส่งคืนข้อมูลที่ไม่บีบอัด

>>>obj = lzma.LZMAFile("test.xz", mode="rb")
>>> data=obj.read()
>>> data
b'Welcome to TutorialsPoint'

อัลกอริทึม LZMA อนุญาตให้เขียนข้อมูลที่บีบอัดไปยังไฟล์ที่เปิดอยู่แล้วได้เช่นกัน ในตัวอย่างต่อไปนี้ 'test.txt' จะเปิดตามปกติ (โดยใช้ฟังก์ชัน open() ในตัว) ในโหมด 'wb' และข้อความบางส่วนจะถูกเขียนลงไป หลังจากนั้น จะใช้ไฟล์เดียวกันในการเขียนข้อมูลที่บีบอัด

>>> f = open("test.txt","wb")
>>>f.write(b"Hello world")
>>>fp = lzma.open(f,"wb")
>>>fp.write(b"Welcome to Python")
>>>f.write(b"Thank you")
>>>f.close()
>>>fp.flush()
>>>fp.close()

เมื่อโค้ดด้านบนถูกเรียกใช้งาน 'test.txt' จะปรากฏในไดเร็กทอรีปัจจุบัน ประกอบด้วยข้อมูลที่บีบอัดและไม่บีบอัดดังนี้

Hello worldý7zXZ æÖ´F!t/å£Thank you

เช่นเดียวกับในโมดูล bz2 โมดูล lzma ก็มีคลาสคอมเพรสเซอร์และตัวขยายขนาดที่เพิ่มขึ้นเช่นกัน

LZMACompressor()

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

บีบอัด()

เมธอดนี้บีบอัดข้อมูลที่กำหนดและส่งคืนอ็อบเจ็กต์ไบต์

ฟลัช()

เมธอดนี้ล้างบัฟเฟอร์และส่งคืนอ็อบเจ็กต์ไบต์

ตัวอย่างต่อไปนี้บีบอัดอ็อบเจ็กต์รายการโดยใช้อ็อบเจ็กต์คอมเพรสเซอร์แบบเพิ่มหน่วย

>>> data = [b'Hello World', b'How are you?', b'welcome to Python']
>>> obj = lzma.LZMACompressor()
>>> bindata = []
>>> for i in data:
bindata.append(obj.compress(i))
>>> bindata.append(obj.flush())
>>> bindata
[b'\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3', b'', b'', b"\x01\x00'Hello WorldHow are you?welcome to Python\x00\xf5\xc6\xc1d|\xf3\x8ey\x00\x01@(\xd4RJ\xe5\x1f\xb6\xf3}\x01\x00\x00\x00\x00\x04YZ"]

โค้ดด้านบนสร้าง bindata เป็นรายการแสดงแทนไบต์ที่บีบอัดของแต่ละรายการในรายการดั้งเดิม ในการดึงข้อมูลที่ไม่บีบอัดโดยใช้ LZMADecompressor วัตถุ ใช้คำสั่งต่อไปนี้

>>> obj = lzma.LZMADecompressor()
>>> binstr = b''.join(bindata)
>>> obj.decompress(binstr)
b'Hello WorldHow are you?welcome to Python'

ในบทความนี้ มีการอธิบายคลาสและฟังก์ชันในโมดูล lzma ด้วยตัวอย่าง