Python使用os、pathlib、shutil實(shí)現(xiàn)文件與目錄自動(dòng)化實(shí)戰(zhàn)
前言
在日常辦公、開發(fā)運(yùn)維、數(shù)據(jù)處理場(chǎng)景中,文件操作是最高頻的需求之一:批量重命名照片、分類整理文檔、批量壓縮文件夾、清理無(wú)用緩存文件、批量讀寫數(shù)據(jù)文件等。手動(dòng)操作重復(fù)繁瑣、效率極低,而Python可以通過(guò)內(nèi)置庫(kù)實(shí)現(xiàn)全自動(dòng)化處理。
Python文件自動(dòng)化核心依賴三大內(nèi)置庫(kù),無(wú)需額外安裝,開箱即用,覆蓋基礎(chǔ)路徑處理、系統(tǒng)級(jí)操作、高級(jí)批量文件處理全場(chǎng)景,是Python自動(dòng)化必備核心技能。
Python 文件操作三大核心庫(kù)對(duì)比:
對(duì)比維度 | pathlib | os | shutil |
|---|---|---|---|
定位 | 現(xiàn)代面向?qū)ο舐窂讲僮?/p> | 系統(tǒng)級(jí)底層文件/目錄操作 | 高級(jí)文件批量操作 |
Python版本 | 3.4+ 新增 | 全版本兼容 | 全版本兼容 |
代碼風(fēng)格 | 簡(jiǎn)潔優(yōu)雅、面向?qū)ο?/p> | 函數(shù)式、傳統(tǒng)繁瑣 | 功能聚合、調(diào)用簡(jiǎn)單 |
核心優(yōu)勢(shì) | 路徑處理極簡(jiǎn)、跨平臺(tái)、可讀性強(qiáng) | 權(quán)限操作、系統(tǒng)參數(shù)獲取、兼容性強(qiáng) | 支持文件夾整體復(fù)制、壓縮、遞歸操作 |
學(xué)習(xí)難度 | 低 | 中 | 低 |
推薦場(chǎng)景 | 日常90%文件路徑操作 | 系統(tǒng)配置、權(quán)限修改、兼容舊項(xiàng)目 | 批量復(fù)制、移動(dòng)、壓縮、刪除文件夾 |
本文將從現(xiàn)代首選pathlib入手,循序漸進(jìn)講解三大庫(kù)的核心用法,搭配可直接運(yùn)行的代碼案例,最后通過(guò)綜合實(shí)戰(zhàn),帶你掌握文件自動(dòng)化全流程開發(fā)。
第一章:核心庫(kù)對(duì)比與環(huán)境準(zhǔn)備
1.1 三大文件庫(kù)定位區(qū)別
很多新手會(huì)混淆os、pathlib、shutil三個(gè)庫(kù),簡(jiǎn)單一句話區(qū)分:
- pathlib:新時(shí)代文件操作標(biāo)準(zhǔn),替代os.path,專門處理路徑、文件判斷、遍歷、讀寫,代碼極簡(jiǎn)
- os:系統(tǒng)底層操作,處理目錄創(chuàng)建、刪除、系統(tǒng)環(huán)境、文件權(quán)限,兼容老舊項(xiàng)目
- shutil:高級(jí)工具庫(kù),彌補(bǔ)os短板,支持整個(gè)文件夾復(fù)制、遞歸刪除、文件壓縮解壓
1.2 環(huán)境與導(dǎo)入方式
三個(gè)庫(kù)均為Python內(nèi)置標(biāo)準(zhǔn)庫(kù),無(wú)需pip安裝,直接導(dǎo)入即可使用:
# 導(dǎo)入三大核心庫(kù) from pathlib import Path import os import shutil
第二章:pathlib —— 現(xiàn)代Python文件操作首選
pathlib采用面向?qū)ο笤O(shè)計(jì),摒棄了os.path繁瑣的字符串拼接方式,跨平臺(tái)兼容性極強(qiáng)(自動(dòng)適配Windows/Linux/Mac路徑分隔符),是目前Python官方推薦的文件操作方式。
2.1 Path路徑創(chuàng)建與解析
支持絕對(duì)路徑、相對(duì)路徑創(chuàng)建,可快速拼接路徑、獲取路徑各層級(jí)信息:
from pathlib import Path
# 1. 創(chuàng)建相對(duì)路徑
p1 = Path("test/file.txt")
# 2. 創(chuàng)建絕對(duì)路徑
p2 = Path("/Users/xxx/Desktop/file.txt")
# 3. 拼接路徑(極簡(jiǎn)寫法,替代字符串拼接)
p3 = Path("test") / "img" / "photo.jpg"
# 路徑信息解析
print("文件名:", p3.name) # photo.jpg
print("文件后綴:", p3.suffix) # .jpg
print("純文件名:", p3.stem) # photo
print("上級(jí)目錄:", p3.parent) # test/img
print("是否絕對(duì)路徑:", p3.is_absolute())2.2 路徑判斷與屬性獲取
快速判斷路徑是否存在、是文件還是文件夾,獲取文件大小、修改時(shí)間等屬性:
from pathlib import Path
p = Path("test.jpg")
# 基礎(chǔ)判斷
print("路徑是否存在:", p.exists())
print("是否是文件:", p.is_file())
print("是否是文件夾:", p.is_dir())
# 文件屬性
if p.exists():
print("文件大小(字節(jié)):", p.stat().st_size)
print("最后修改時(shí)間:", p.stat().st_mtime)2.3 文件/目錄創(chuàng)建與刪除
from pathlib import Path
# 1. 創(chuàng)建單層目錄
dir1 = Path("test_dir")
dir1.mkdir(exist_ok=True) # exist_ok=True 存在則不報(bào)錯(cuò)
# 2. 創(chuàng)建多級(jí)嵌套目錄
dir2 = Path("a/b/c")
dir2.mkdir(parents=True, exist_ok=True)
# 3. 創(chuàng)建空文件
file = Path("test.txt")
file.touch(exist_ok=True)
# 4. 刪除文件/空目錄
file.unlink(missing_ok=True) # 刪除文件
dir1.rmdir() # 刪除空目錄2.4 遍歷目錄與批量匹配文件
支持遍歷文件夾、批量篩選指定后綴文件,是批量處理的核心功能:
from pathlib import Path
# 目標(biāo)文件夾
root = Path("./photos")
# 1. 遍歷當(dāng)前目錄所有文件(不遞歸)
for file in root.iterdir():
if file.is_file():
print("文件:", file.name)
# 2. 批量匹配所有jpg/png圖片(遞歸遍歷子文件夾)
img_list = list(root.rglob("*.jpg")) + list(root.rglob("*.png"))
print("圖片總數(shù):", len(img_list))
# 3. 匹配所有txt文檔
txt_list = list(root.rglob("*.txt"))2.5 文件讀寫極簡(jiǎn)操作
pathlib簡(jiǎn)化了文件讀寫操作,無(wú)需手動(dòng)open/close,代碼更簡(jiǎn)潔:
from pathlib import Path
file = Path("data.txt")
# 寫入內(nèi)容(覆蓋寫入)
file.write_text("Hello Python文件自動(dòng)化!", encoding="utf-8")
# 追加內(nèi)容
file.write_text("\n新增一行內(nèi)容", encoding="utf-8")
# 讀取內(nèi)容
content = file.read_text(encoding="utf-8")
print("文件內(nèi)容:", content)
# 讀寫二進(jìn)制文件(圖片、視頻等)
img = Path("test.jpg")
img_data = img.read_bytes()第三章:os模塊 —— 底層系統(tǒng)級(jí)文件操作
os模塊是Python傳統(tǒng)文件操作核心,主打系統(tǒng)層級(jí)操作,適合需要兼容舊項(xiàng)目、修改文件權(quán)限、獲取系統(tǒng)路徑的場(chǎng)景。
3.1 常用路徑與目錄操作
import os
# 獲取當(dāng)前工作目錄
print("當(dāng)前目錄:", os.getcwd())
# 切換工作目錄
os.chdir("./test")
# 創(chuàng)建/刪除目錄
os.mkdir("os_dir") # 單層目錄
os.makedirs("x/y/z", exist_ok=True) # 多級(jí)目錄
os.rmdir("os_dir") # 刪除空目錄
# 路徑拼接(傳統(tǒng)方式)
path = os.path.join("test", "img", "1.jpg")
print("拼接路徑:", path)
# 判斷路徑
print(os.path.exists(path))
print(os.path.isfile(path))
print(os.path.isdir(path))3.2 系統(tǒng)環(huán)境與文件權(quán)限操作
import os
# 獲取系統(tǒng)環(huán)境變量
print("系統(tǒng)PATH:", os.environ.get("PATH"))
# 修改文件權(quán)限(Linux/Mac生效)
os.chmod("test.txt", 0o755)
# 獲取文件絕對(duì)路徑
abs_path = os.path.abspath("test.txt")
print("絕對(duì)路徑:", abs_path)3.3 傳統(tǒng)文件遍歷方法
import os
# 遍歷目錄所有文件
for root, dirs, files in os.walk("./test"):
print("當(dāng)前遍歷目錄:", root)
print("子文件夾:", dirs)
print("所有文件:", files)第四章:shutil —— 高級(jí)文件批量操作工具
os和pathlib無(wú)法直接復(fù)制/移動(dòng)非空文件夾,也不支持壓縮解壓,shutil完美彌補(bǔ)該短板,是批量文件處理的核心工具。
4.1 文件/文件夾復(fù)制與移動(dòng)
import shutil
# 1. 復(fù)制單個(gè)文件
shutil.copy("test.txt", "copy_test.txt")
# 2. 復(fù)制整個(gè)文件夾(包含所有子文件)
shutil.copytree("./src_dir", "./dst_dir", dirs_exist_ok=True)
# 3. 移動(dòng)文件/文件夾
shutil.move("copy_test.txt", "./dst_dir/copy_test.txt")
# 4. 重命名文件
shutil.move("old_name.txt", "new_name.txt")4.2 批量刪除與遞歸清空
import shutil
# 遞歸刪除整個(gè)文件夾(包含所有文件和子文件夾)
shutil.rmtree("./dst_dir", ignore_errors=True)4.3 壓縮與解壓文件
import shutil
import zipfile
# 1. 壓縮整個(gè)文件夾為zip
shutil.make_archive("壓縮包", "zip", "./src_dir")
# 2. 解壓zip文件
with zipfile.ZipFile("壓縮包.zip", "r") as zip_ref:
zip_ref.extractall("./解壓目錄")第五章:綜合實(shí)戰(zhàn):文件批量自動(dòng)化工具
整合三大庫(kù)核心功能,開發(fā)3個(gè)可直接落地的實(shí)戰(zhàn)腳本,覆蓋日常高頻自動(dòng)化場(chǎng)景。
5.1 實(shí)戰(zhàn)1:批量重命名文件
批量修改文件夾內(nèi)所有圖片名稱,統(tǒng)一格式:序號(hào)+自定義名稱
from pathlib import Path
def batch_rename(folder_path, prefix="風(fēng)景"):
"""批量重命名圖片文件"""
path = Path(folder_path)
# 篩選所有圖片
img_list = list(path.glob("*.jpg")) + list(path.glob("*.png"))
for idx, file in enumerate(img_list, 1):
# 新文件名
new_name = f"{prefix}_{idx}{file.suffix}"
new_path = path / new_name
file.rename(new_path)
print(f"重命名成功: {file.name} → {new_name}")
# 調(diào)用
batch_rename("./photos", prefix="旅行照片")5.2 實(shí)戰(zhàn)2:分類整理不同格式文件
自動(dòng)識(shí)別文件后綴,將圖片、文檔、視頻、壓縮包分類歸檔
from pathlib import Path
import shutil
def classify_files(folder_path):
"""文件自動(dòng)分類整理"""
path = Path(folder_path)
# 定義文件分類規(guī)則
classify_rule = {
"圖片": [".jpg", ".png", ".jpeg", ".gif"],
"文檔": [".txt", ".pdf", ".docx", ".xlsx"],
"壓縮包": [".zip", ".rar", ".7z"],
"視頻": [".mp4", ".avi", ".mov"]
}
# 遍歷所有文件
for file in path.iterdir():
if file.is_dir():
continue
suffix = file.suffix.lower()
# 匹配分類
for folder, suffix_list in classify_rule.items():
if suffix in suffix_list:
target_dir = path / folder
target_dir.mkdir(exist_ok=True)
shutil.move(str(file), str(target_dir / file.name))
print(f"分類成功: {file.name} → {folder}")
break
# 調(diào)用
classify_files("./混合文件")5.3 實(shí)戰(zhàn)3:批量壓縮指定目錄文件
import shutil
from datetime import datetime
def zip_folder(folder_path):
"""批量壓縮文件夾,命名帶時(shí)間戳"""
now = datetime.now().strftime("%Y%m%d%H%M%S")
zip_name = f"文件備份_{now}"
shutil.make_archive(zip_name, "zip", folder_path)
print(f"壓縮完成,文件名稱:{zip_name}.zip")
# 調(diào)用
zip_folder("./photos_processed")三大庫(kù)選擇指南與最佳實(shí)踐
業(yè)務(wù)需求 | 推薦庫(kù) | 核心原因 |
|---|---|---|
路徑拼接、文件遍歷、批量篩選 | pathlib | 代碼簡(jiǎn)潔、跨平臺(tái)、可讀性極強(qiáng) |
文件讀寫、判斷文件屬性 | pathlib | 極簡(jiǎn)API,無(wú)需手動(dòng)管理文件句柄 |
系統(tǒng)環(huán)境獲取、文件權(quán)限修改 | os | 專屬系統(tǒng)級(jí)操作,無(wú)替代方案 |
兼容老舊Python項(xiàng)目 | os/os.path | 低版本Python不支持pathlib |
文件夾整體復(fù)制、遞歸刪除 | shutil | 唯一支持批量文件夾操作的內(nèi)置庫(kù) |
文件壓縮、解壓、批量遷移 | shutil+zipfile | 功能完善、開箱即用 |
總結(jié)
1、優(yōu)先使用pathlib:日常90%的文件路徑、遍歷、讀寫場(chǎng)景,pathlib都是最優(yōu)選擇,代碼更優(yōu)雅、跨平臺(tái)兼容性更好。
2、os作為補(bǔ)充:僅在需要系統(tǒng)級(jí)操作、兼容舊項(xiàng)目時(shí)使用。
3、shutil處理批量復(fù)雜操作:文件夾復(fù)制、遞歸刪除、壓縮解壓必備。
三者組合使用,可以實(shí)現(xiàn)所有文件自動(dòng)化場(chǎng)景,徹底解放雙手,大幅提升辦公和開發(fā)效率。
以上就是Python使用os、pathlib、shutil實(shí)現(xiàn)文件與目錄自動(dòng)化實(shí)戰(zhàn)的詳細(xì)內(nèi)容,更多關(guān)于Python文件與目錄自動(dòng)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Flask學(xué)習(xí)筆記之日志操作配置實(shí)例講解
這篇文章主要為大家介紹了Flask學(xué)習(xí)筆記之日志操作配置實(shí)例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Python中微服務(wù)架構(gòu)的設(shè)計(jì)與實(shí)現(xiàn)詳解
在當(dāng)今軟件開發(fā)領(lǐng)域中,微服務(wù)架構(gòu)已經(jīng)成為了一種流行的設(shè)計(jì)范式,這篇文章主要為大家介紹了如何使用Python語(yǔ)言來(lái)設(shè)計(jì)和實(shí)現(xiàn)微服務(wù)架構(gòu),需要的可以參考一下2024-04-04
Python numpy和matlab的幾點(diǎn)差異介紹
這篇文章主要介紹了Python numpy和matlab的幾點(diǎn)差異,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
python實(shí)現(xiàn)批量下載新浪博客的方法
這篇文章主要介紹了python實(shí)現(xiàn)批量下載新浪博客的方法,涉及Python頁(yè)面抓取的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-06-06

