ZIP 壓縮檔案和解壓縮
Python 內建的 `zipfile` 模組可用來建立、讀取、壓縮與解壓縮 ZIP 檔案,不需要額外安裝套件。
## 1. 壓縮多個檔案
以下範例會將 `reports` 資料夾中的多個報表檔案壓縮成 `reports.zip`。
```python
from pathlib import Path
from zipfile import ZipFile, ZIP_DEFLATED
source_dir = Path("reports")
zip_path = Path("reports.zip")
with ZipFile(zip_path, mode="w", compression=ZIP_DEFLATED) as zip_file:
for file_path in source_dir.glob("*.csv"):
# arcname 用來指定 ZIP 內顯示的檔名,
# 避免把完整的本機路徑寫入壓縮檔
zip_file.write(file_path, arcname=file_path.name)
print(f"已建立壓縮檔:{zip_path}")
```
假設目錄結構如下:
```text
reports/
├── january.csv
├── february.csv
└── march.csv
```
執行後會產生:
```text
reports.zip
├── january.csv
├── february.csv
└── march.csv
```
### 重點說明
- `ZipFile(..., "w")`:建立新的 ZIP 檔案。
- `ZIP_DEFLATED`:使用常見的壓縮方式。
- `write()`:將檔案加入 ZIP。
- `arcname`:指定檔案在 ZIP 內的名稱。
- 若要包含子目錄,可使用:
```python
for file_path in source_dir.rglob("*"):
if file_path.is_file():
zip_file.write(file_path, arcname=file_path.relative_to(source_dir))
```
---
## 2. 解壓縮多個檔案
以下範例會將 `reports.zip` 中的所有檔案解壓縮到 `extracted_reports` 資料夾。
```python
from pathlib import Path
from zipfile import ZipFile
zip_path = Path("reports.zip")
extract_dir = Path("extracted_reports")
extract_dir.mkdir(exist_ok=True)
with ZipFile(zip_path, mode="r") as zip_file:
zip_file.extractall(extract_dir)
print(f"檔案已解壓縮至:{extract_dir}")
```
執行後的結果:
```text
extracted_reports/
├── january.csv
├── february.csv
└── march.csv
```
### 查看 ZIP 內容
如果只想先查看壓縮檔內有哪些檔案,可以使用:
```python
from zipfile import ZipFile
with ZipFile("reports.zip", "r") as zip_file:
for name in zip_file.namelist():
print(name)
```
### 安全提醒
對於來源不明的 ZIP 檔案,直接使用 `extractall()` 可能有路徑穿越風險。若 ZIP 來自使用者上傳或外部來源,應先驗證檔案名稱,避免解壓縮到目標資料夾之外。
相關學習地圖、教學課程
Python 資料工程
Python 後端工程、資料庫