ZIP เป็นหนึ่งในรูปแบบไฟล์ที่นิยมมากที่สุดสำหรับการเก็บถาวร (archiving) และการบีบอัด (compression) ใช้มาตั้งแต่ยุค MSDOS และ PC และถูกใช้โดยแอปพลิเคชัน PKZYP ที่มีชื่อเสียง
โมดูล zipfile ในไลบรารีมาตรฐานของ Python มีคลาสที่อำนวยความสะดวกเครื่องมือสำหรับการสร้าง, แยก, อ่าน และเขียนไปยังไฟล์เก็บถาวร ZIP
ZipFile()
ฟังก์ชันนี้คืนค่าอ็อบเจ็กต์ ZipFile จากพารามิเตอร์ไฟล์ซึ่งสามารถเป็นสตริงหรืออ็อบเจ็กต์ไฟล์ที่สร้างโดยฟังก์ชันสำเร็จรูป open() ฟังก์ชันต้องการพารามิเตอร์ mode ที่ค่าเริ่มต้นคือ 'r' แม้จะสามารถรับค่า 'w' หรือ 'a' สำหรับเปิดไฟล์เก็บถาวรในโหมดอ่าน, เขียน หรือต่อท้ายตามลำดับ
ไฟล์เก็บถาวรโดยค่าเริ่มต้นไม่ถูกบีบอัด เพื่อระบุชนิดของอัลกอริทึมการบีบอัดที่จะใช้ ต้องกำหนดค่าคงที่หนึ่งให้กับพารามิเตอร์ compression:
| zipfile.ZIP_STORED | สำหรับสมาชิกไฟล์เก็บถาวรที่ไม่บีบอัด |
| zipfile.ZIP_DEFLATED | สำหรับวิธีการบีบอัด ZIP ปกติ ต้องการโมดูล zlib |
| zipfile.ZIP_BZIP2 | สำหรับวิธีการบีบอัด BZIP2 ต้องการโมดูล bz2 |
| zipfile.ZIP_LZMA | สำหรับวิธีการบีบอัด LZMA ต้องการโมดูล lzma |
อ็อบเจ็กต์ ZipFile ใช้เมธอดต่อไปนี้:
write()
เมธอดนี้เพิ่มไฟล์ที่กำหนดเข้าไปในไฟล์เก็บถาวรที่แทนโดยอ็อบเจ็กต์ ZipFile:
>>> import zipfile
>>> newzip = zipfile.ZipFile('newdir/newzip.zip', 'w')
>>> newzip.write('zen.txt')
>>> newzip.close()
ไฟล์เพิ่มเติมสามารถเพิ่มเข้าไปในไฟล์เก็บถาวรที่มีอยู่แล้วโดยการเปิดในโหมดต่อท้าย ('a' เป็น mode):
>>> newzip = zipfile.ZipFile('newdir/newzip.zip', 'a')
>>> newzip.write('zen.txt')
>>> newzip.close()
read()
เมธอดนี้อ่านข้อมูลจากไฟล์เฉพาะในไฟล์เก็บถาวร:
>>> newzip = zipfile.ZipFile('newdir/newzip.zip', 'r')
>>> data = newzip.read('json.txt')
>>> data
b'["Rakesh", {"marks": [50, 60, 70]}]'
printdir()
เมธอดนี้แสดงรายการไฟล์ทั้งหมดในไฟล์เก็บถาวรที่กำหนด:
>>> newzip.printdir() File Name Modified Size json.txt 2018-11-27 17:04:40 35 zen.txt 2018-11-25 23:13:44 878
extract()
เมธอดนี้แยกไฟล์ที่ระบุจากไฟล์เก็บถาวร โดยค่าเริ่มต้นไปยังไดเรกทอรีปัจจุบัน หรือไปยังอันที่ให้เป็นพารามิเตอร์ที่สอง:
>>> newzip.extract('json.txt', 'newdir')
'newdir\\json.txt'
extractall()
เมธอดนี้แยกไฟล์ทั้งหมดในไฟล์เก็บถาวรไปยังไดเรกทอรีปัจจุบันโดยค่าเริ่มต้น ระบุไดเรกทอรีทางเลือกหากต้องการเป็นพารามิเตอร์:
>>> newzip.extractall('newdir')
getinfo()
เมธอดนี้คืนค่าอ็อบเจ็กต์ ZipInfo ที่สอดคล้องกับไฟล์ที่กำหนด อ็อบเจ็กต์ ZipInfo มีข้อมูลเมตาต่างๆ ของไฟล์:
โค้ดต่อไปนี้ได้อ็อบเจ็กต์ ZipInfo ของ 'zen.txt' จากไฟล์เก็บถาวร และดึงชื่อไฟล์, ขนาด และข้อมูลวันที่-เวลาจากมัน:
>>> inf = newzip.getinfo('zen.txt')
>>> inf.filename, inf.file_size, inf.date_time
('zen.txt', 878, (2018, 11, 25, 23, 13, 45))
infolist()
เมธอดนี้คืนค่ารายการของอ็อบเจ็กต์ ZipInfo ของไฟล์ทั้งหมดในไฟล์เก็บถาวร:
>>> newzip.infolist() [, ]
ตามที่กล่าวไว้ก่อนหน้า อัลกอริทึมการบีบอัดที่จะใช้ขณะสร้างไฟล์เก็บถาวร ZIP ระบุในพารามิเตอร์ compression ในโค้ดต่อไปนี้ ค่าคงที่ ZIP_DEFLATED สร้างไฟล์เก็บถาวรโดยใช้การบีบอัด zlib:
>>> zipobj = zipfile.ZipFile('txtzip.zip', mode='w', compression=zipfile.ZIP_DEFLATED)
>>> files = glob.glob("*.txt")
>>> for file in files:
... zipobj.write(file)
>>> zipobj.close()
namelist()
เมธอดนี้ของอ็อบเจ็กต์ ZipFile คืนค่ารายการของไฟล์ทั้งหมดในไฟล์เก็บถาวร:
>>> zipobj = zipfile.ZipFile('txtzip.zip', mode='r')
>>> zipobj.namelist()
['a!.txt', 'data().txt', 'dict.txt', 'json.txt', 'LICENSE.txt', 'lines.txt', 'msg.txt', 'NEWS.txt', 'test.txt/', 'zen.txt', 'zen1.txt', 'zenbak.txt']
setpassword()
เมธอดนี้ตั้งค่าพารามิเตอร์รหัสผ่านซึ่งต้องให้ในขณะแยกไฟล์เก็บถาวร
PyZipFile()
ฟังก์ชันนี้ในโมดูล zipfile คืนค่าอ็อบเจ็กต์ PyZipFile อ็อบเจ็กต์ PyZipFile สามารถสร้างโมดูลที่มีไฟล์ที่มีนามสกุล .py ไฟล์เก็บถาวรนี้สามารถเพิ่มในตัวแปรสภาพแวดล้อม sys.path เพื่อให้โมดูลสามารถนำเข้าได้โดยใช้โมดูล zipimport
เมธอด writepy() เพิ่มไฟล์ .py ในไฟล์เก็บถาวรหลังจากคอมไพล์ในไฟล์ .pyc ที่สอดคล้อง:
files = glob.glob("*.py")
>>> pyzipobj = zipfile.PyZipFile('pyfiles/pyzip.zip', mode='w', compression=zipfile.ZIP_LZMA)
>>> for file in files:
... pyzipobj.writepy(file)
>>> pyzipobj.close()
ในบทความนี้ คลาสและฟังก์ชันในโมดูล zipfile ได้รับการอภิปราย