ใช้ zipfile สร้าง Zip Archive ของ Directory เดิน Directory Tree ด้วย os.walk เพิ่มไฟล์ทีละไฟล์แบบ Recursive
ฟังก์ชัน Zip Directory
import os
import zipfile
def zipdir(path, ziph):
"""Add all files in path to zip handle ziph"""
for root, dirs, files in os.walk(path):
for file in files:
filepath = os.path.join(root, file)
# Archive name: relative path จาก path ที่กำหนด
arcname = os.path.relpath(filepath, path)
ziph.write(filepath, arcname)
# ใช้งาน
zipf = zipfile.ZipFile('Zipped_file.zip', 'w', zipfile.ZIP_DEFLATED)
zipdir('./my_folder', zipf)
zipf.close()
Context Manager Version (แนะนำ)
>> import os, zipfile
>>> with zipfile.ZipFile('Zipped_file.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
... for root, dirs, files in os.walk('./my_folder'):
... for file in files:
... filepath = os.path.join(root, file)
... arcname = os.path.relpath(filepath, './my_folder')
... zipf.write(filepath, arcname)
คำอธิบาย
os.walk(path)→ Generator ของ (root, dirs, files) ทุกชั้นos.path.join(root, file)→ Absolute path ของไฟล์จริงos.path.relpath(filepath, base)→ Relative path ภายใน Zip (ไม่รวม base folder)ZIP_DEFLATED→ Compression method (ต้องมี zlib)
เพิ่มไฟล์เดี่ยว (ไม่ใช่ Directory)
>> with zipfile.ZipFile('single.zip', 'w') as zf:
... zf.write('file.txt') # ใช้ชื่อไฟล์เป็น arcname
... zf.write('data.csv', 'new.csv') # ระบุ arcname เอง