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

การทำงานกับไฟล์ zip ใน Python

ในไลบรารีมาตรฐานของ 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