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

การทำงานกับไฟล์ ZIP ใน Python (zipfile)

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 ได้รับการอภิปราย