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

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


ZIP เป็นรูปแบบไฟล์ที่นิยมใช้กันมากที่สุดรูปแบบหนึ่งสำหรับการเก็บถาวรและการบีบอัด มีการใช้งานมาตั้งแต่สมัย MSDOS และ PC และถูกใช้โดยแอปพลิเคชั่น PKZIP ที่มีชื่อเสียง

โมดูล zipfile ในไลบรารีมาตรฐานของ Python มีคลาสที่อำนวยความสะดวกให้กับเครื่องมือสำหรับการสร้าง แยก อ่าน และเขียนไปยังไฟล์ ZIP

ZipFile()

ฟังก์ชันนี้ส่งคืนออบเจ็กต์ ZipFile จากพารามิเตอร์ไฟล์ซึ่งสามารถเป็นสตริงหรือออบเจ็กต์ไฟล์ที่สร้างขึ้นโดยฟังก์ชัน open() ในตัว ฟังก์ชันต้องการพารามิเตอร์โหมดที่มีค่าเริ่มต้นคือ 'r' แม้ว่าจะใช้ค่า 'w' หรือ 'a' ในการเปิดไฟล์เก็บถาวรในโหมดอ่าน เขียน หรือผนวกตามลำดับ

ไฟล์เก็บถาวรตามค่าเริ่มต้นจะไม่ถูกบีบอัด ในการระบุประเภทของอัลกอริธึมการบีบอัดที่จะใช้ จะต้องกำหนดหนึ่งในค่าคงที่ให้กับพารามิเตอร์การบีบอัด

zipfile.ZIP_STORED สำหรับสมาชิกไฟล์เก็บถาวรที่ไม่มีการบีบอัด
zipfile.ZIP_DEFLATED สำหรับวิธีบีบอัดไฟล์ ZIP ปกติ สิ่งนี้ต้องการโมดูล zlib
zipfile.ZIP_BZIP2 สำหรับวิธีการบีบอัด BZIP2 ต้องใช้โมดูล bz2
zipfile.ZIP_LZMA สำหรับวิธีการบีบอัด LZMA สิ่งนี้ต้องใช้โมดูล lzma

วัตถุ ZipFile ใช้วิธีการดังต่อไปนี้

เขียน()

เมธอดนี้กำหนดไฟล์ให้กับไฟล์เก็บถาวรที่แสดงโดยออบเจกต์ ZipFile

>>> import zipfile
>>> newzip=zipfile.ZipFile('newdir/newzip.zip','w')
>>> newzip.write('zen.txt')
>>> newzip.close()

ไฟล์เพิ่มเติมสามารถเพิ่มลงในไฟล์เก็บถาวรที่มีอยู่แล้วได้โดยเปิดไฟล์ในโหมดผนวก ('a' เป็นโหมด)

>>> newzip=zipfile.ZipFile('newdir/newzip.zip','a')
>>> newzip.write('zen.txt')
>>> newzip.close()

อ่าน()

เมธอดนี้อ่านข้อมูลจากไฟล์เฉพาะในไฟล์เก็บถาวร

>>> 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-2717:04:40 35
zen.txt 2018-11-2523:13:44 878

สารสกัด()

เมธอดนี้จะแยกไฟล์ที่ระบุจากไฟล์เก็บถาวรโดยค่าเริ่มต้นไปยังไดเร็กทอรีปัจจุบันหรือจากไฟล์ที่กำหนดเป็นพารามิเตอร์ที่สอง

>>> newzip.extract('json.txt','newdir')
'newdir\\json.txt'

แตกไฟล์()

เมธอดนี้จะแตกไฟล์ทั้งหมดในไฟล์เก็บถาวรไปยังไดเร็กทอรีปัจจุบันตามค่าเริ่มต้น ระบุไดเร็กทอรีสำรองหากต้องการเป็นพารามิเตอร์

>>> 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()
[<ZipInfo filename = 'json.txt' filemode='-rw-rw-rw-' file_size=35>, <ZipInfo filename = 'zen.txt' filemode='-rw-rw-rw-' file_size=878>]

ดังที่ได้กล่าวไว้ก่อนหน้านี้ อัลกอริธึมการบีบอัดที่จะใช้ในขณะที่สร้างไฟล์ ZIP ถูกระบุในพารามิเตอร์การบีบอัด ในโค้ดต่อไปนี้ ค่าคงที่ของ 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