ในไลบรารีมาตรฐานของ Python มีโมดูลชื่อ zipfile ด้วยโมดูลนี้เราสามารถทำการดำเนินการต่างๆ บนไฟล์ zip ได้
Zip Files เป็น archive file format ใช้เพื่อให้ได้ lossless data compression จากรูปแบบที่บีบอัดแล้ว สามารถสร้างกลับได้อย่างสมบูรณ์ ไฟล์ zip หนึ่งไฟล์สามารถเก็บไฟล์ที่บีบอัดได้หนึ่งหรือหลายไฟล์
คุณสมบัติที่ดีของไฟล์ zip คือ ลดพื้นที่จัดเก็บ และเพิ่มความเร็วในการถ่ายโอนผ่านการเชื่อมต่อมาตรฐาน
ใน Python เราต้อง import โมดูล zipfile เพื่อใช้ไฟล์ zip
from zipfile import ZipFile
ก่อนอื่นเราจะดูวิธีสร้างไฟล์ Zip จากไดเรกทอรี ในกรณีนี้ ไดเรกทอรีหลักมีไฟล์และไดเรกทอรีย่อยบางส่วน
ดังนั้นก่อนอื่นเราต้อง crawl ทั้งไดเรกทอรีเพื่อดึงไฟล์และโฟลเดอร์ทั้งหมดและเก็บ path เป็นลิสต์ จากนั้นเปิด Zip File ในโหมดเขียน และเขียนทั้งหมดจาก path ที่เก็บไว้
ตัวอย่างโค้ด
# ดึงไฟล์ทั้งหมดจากไดเรกทอรีและ subdirectories แปลงเป็น zip
from zipfile import ZipFile
import os
def get_all_files(directory):
paths = []
for root, dirs, files in os.walk(directory):
for f_name in files:
path = os.path.join(root, f_name)
paths.append(path)
return paths
directory = './sample_files'
paths = get_all_files(directory)
# แสดงชื่อไฟล์
print('The following files will be stored in the zip file')
for file in paths:
print(file)
# เปิด zip file ในโหมดเขียนเพื่อสร้าง zip
with ZipFile('my_files.zip', 'w') as zf:
for file in paths:
zf.write(file)
print('Zip is created Successfully')
ผลลัพธ์
The following files will be stored in the zip file ./sample_files\TP_python_prev.pdf ./sample_files\text_files\file1.txt ./sample_files\text_files\file2.txt Zip is created Successfully
ตอนนี้ดูวิธีแยกไฟล์ zip ด้วยโมดูล zipfile เพื่อแยก zip ก่อนอื่นต้องเปิดไฟล์ zip ในโหมด read จากนั้นใช้เมธอด extract() หรือ extractall() เพื่อแยกเนื้อหา เมธอด extract() รับ path เพื่อระบุตำแหน่งไฟล์จาก Zip file ที่จะแยก
ตัวอย่างโค้ด
# แยกไฟล์ zip
from zipfile import ZipFile
zip_file = 'my_files.zip'
with ZipFile(zip_file, 'r') as zf:
# แสดงไฟล์ภายใน zip
zf.printdir()
# แยกไฟล์จาก zip file
zf.extractall()
print('Zip Extraction Completed')
ผลลัพธ์
File Name Modified Size sample_files/TP_python_prev.pdf 2018-10-19 13:19:48 1915882 sample_files/text_files/file1.txt 2018-11-06 13:34:46 22 sample_files/text_files/file2.txt 2018-11-06 13:35:02 24 Zip Extraction Completed
ตอนนี้เราจะพูดถึงเมธอด infolist() ของโมดูล zipfile ซึ่งให้ลิสต์ข้อมูลต่างๆ เช่น filename, วันที่แก้ไข, ขนาดไฟล์ ฯลฯ
ตัวอย่างโค้ด
# ดูข้อมูลเกี่ยวกับไฟล์ zip
from zipfile import ZipFile
import datetime
zip_file = 'my_files.zip'
with ZipFile(zip_file, 'r') as zf:
for detail in zf.infolist():
print('File Name: ' + detail.filename)
print('\tModify Date: ' + str(datetime.datetime(*detail.date_time)))
print('\tZip Version: ' + str(detail.create_version))
print('\tSystem Version: ' + str(detail.create_system))
print('\tFile Size (Bytes): ' + str(detail.file_size))
ผลลัพธ์
File Name: sample_files/TP_python_prev.pdf Modify Date: 2018-10-19 13:19:48 Zip Version: 20 System Version: 0 File Size (Bytes): 1915882 File Name: sample_files/text_files/file1.txt Modify Date: 2018-11-06 13:34:46 Zip Version: 20 System Version: 0 File Size (Bytes): 22 File Name: sample_files/text_files/file2.txt Modify Date: 2018-11-06 13:35:02 Zip Version: 20 System Version: 0 File Size (Bytes): 24