อัลกอริธึมลูกโซ่ 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 ด้วยตัวอย่าง