发布于2026-06-30 阅读(0)
扫一扫,手机访问
在日常办公、开发运维或者数据处理中,文件操作绝对算得上是最高频的需求之一。想想看,你是不是经常需要批量重命名一堆照片、把散落的文档按格式归归类、压缩整个文件夹、清理那些怎么也删不完的缓存文件,甚至是批量读写几百个数据文件?这些事儿要是手动来,不仅重复繁琐,效率还低得让人抓狂。而Python恰好能通过几个内置库,把这一切变成全自动的流水线。

实现文件自动化的核心,主要靠三个Python内置库——os、pathlib、shutil。它们不需要额外安装,开箱即用,覆盖了从基础的路径处理、系统级操作到高级批量文件处理的全场景。毫不夸张地说,这三大库是Python自动化领域的必修课,也是提升工作效率的关键技能。
在正式开讲之前,先来一张对比表,让大家对这三个库有个全局印象:
对比维度 | pathlib | os | shutil |
|---|---|---|---|
定位 | 现代面向对象路径操作 | 系统级底层文件/目录操作 | 高级文件批量操作 |
Python版本 | 3.4+ 新增 | 全版本兼容 | 全版本兼容 |
代码风格 | 简洁优雅、面向对象 | 函数式、传统繁琐 | 功能聚合、调用简单 |
核心优势 | 路径处理极简、跨平台、可读性强 | 权限操作、系统参数获取、兼容性强 | 支持文件夹整体复制、压缩、递归操作 |
学习难度 | 低 | 中 | 低 |
推荐场景 | 日常90%文件路径操作 | 系统配置、权限修改、兼容旧项目 | 批量复制、移动、压缩、删除文件夹 |
接下来,我们将从现代首选pathlib入手,循序渐进地讲解三大库的核心用法,每个知识点都配上可以直接运行的代码。最后,再通过几个综合实战案例,带你真正掌握文件自动化的全流程开发。
很多新手一开始就容易把os、pathlib、shutil这三个库搞混。其实一句话就能区分清楚:
好消息是,这三个库都是Python内置的,连pip都不用装,直接导入就能用:
# 导入三大核心库 from pathlib import Path import os import shutil
pathlib采用面向对象的设计,彻底抛弃了os.path那种繁琐的字符串拼接方式。更重要的是,它跨平台兼容性极好——不管你在Windows还是Linux/Mac上跑,路径分隔符它自己会处理好。这也是目前Python官方推荐的文件操作方式。
Path对象支持绝对路径和相对路径的创建,用“/”来拼接路径,比字符串加号优雅多了。还能快速获取路径的各个层级信息:
from pathlib import Path
# 1. 创建相对路径
p1 = Path("test/file.txt")
# 2. 创建绝对路径
p2 = Path("/Users/xxx/Desktop/file.txt")
# 3. 拼接路径(极简写法,替代字符串拼接)
p3 = Path("test") / "img" / "photo.jpg"
# 路径信息解析
print("文件名:", p3.name) # photo.jpg
print("文件后缀:", p3.suffix) # .jpg
print("纯文件名:", p3.stem) # photo
print("上级目录:", p3.parent) # test/img
print("是否绝对路径:", p3.is_absolute())
想知道一个路径是文件还是文件夹?它存不存在?有多大?用这几行代码就行:
from pathlib import Path
p = Path("test.jpg")
# 基础判断
print("路径是否存在:", p.exists())
print("是否是文件:", p.is_file())
print("是否是文件夹:", p.is_dir())
# 文件属性
if p.exists():
print("文件大小(字节):", p.stat().st_size)
print("最后修改时间:", p.stat().st_mtime)
from pathlib import Path
# 1. 创建单层目录
dir1 = Path("test_dir")
dir1.mkdir(exist_ok=True) # exist_ok=True 存在则不报错
# 2. 创建多级嵌套目录
dir2 = Path("a/b/c")
dir2.mkdir(parents=True, exist_ok=True)
# 3. 创建空文件
file = Path("test.txt")
file.touch(exist_ok=True)
# 4. 删除文件/空目录
file.unlink(missing_ok=True) # 删除文件
dir1.rmdir() # 删除空目录
批量处理文件时,最常用的就是遍历目录和按后缀名筛选文件。pathlib的rglob方法支持递归遍历所有子文件夹,堪称批量处理的核心利器:
from pathlib import Path
# 目标文件夹
root = Path("./photos")
# 1. 遍历当前目录所有文件(不递归)
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("图片总数:", len(img_list))
# 3. 匹配所有txt文档
txt_list = list(root.rglob("*.txt"))
pathlib把文件读写也简化了,不用再手动open/close,代码干净得像流水一样:
from pathlib import Path
file = Path("data.txt")
# 写入内容(覆盖写入)
file.write_text("Hello Python文件自动化!", encoding="utf-8")
# 追加内容
file.write_text("n新增一行内容", encoding="utf-8")
# 读取内容
content = file.read_text(encoding="utf-8")
print("文件内容:", content)
# 读写二进制文件(图片、视频等)
img = Path("test.jpg")
img_data = img.read_bytes()
os模块虽然传统,但在某些场景下依然是不可替代的存在。它擅长系统层级操作,比如获取环境变量、修改文件权限,或者你需要在老旧项目里做兼容的时候,它是最稳妥的选择。
import os
# 获取当前工作目录
print("当前目录:", os.getcwd())
# 切换工作目录
os.chdir("./test")
# 创建/删除目录
os.mkdir("os_dir") # 单层目录
os.makedirs("x/y/z", exist_ok=True) # 多级目录
os.rmdir("os_dir") # 删除空目录
# 路径拼接(传统方式)
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))
import os
# 获取系统环境变量
print("系统PATH:", os.environ.get("PATH"))
# 修改文件权限(Linux/Mac生效)
os.chmod("test.txt", 0o755)
# 获取文件绝对路径
abs_path = os.path.abspath("test.txt")
print("绝对路径:", abs_path)
import os
# 遍历目录所有文件
for root, dirs, files in os.walk("./test"):
print("当前遍历目录:", root)
print("子文件夹:", dirs)
print("所有文件:", files)
os和pathlib有个共同的短板:它们没办法直接复制或移动一个非空文件夹,更不用说压缩解压了。而shutil恰好就是为补这个短板而生的。它也是批量文件处理场景下的核心工具。
import shutil
# 1. 复制单个文件
shutil.copy("test.txt", "copy_test.txt")
# 2. 复制整个文件夹(包含所有子文件)
shutil.copytree("./src_dir", "./dst_dir", dirs_exist_ok=True)
# 3. 移动文件/文件夹
shutil.move("copy_test.txt", "./dst_dir/copy_test.txt")
# 4. 重命名文件
shutil.move("old_name.txt", "new_name.txt")
import shutil
# 递归删除整个文件夹(包含所有文件和子文件夹)
shutil.rmtree("./dst_dir", ignore_errors=True)
import shutil
import zipfile
# 1. 压缩整个文件夹为zip
shutil.make_archive("压缩包", "zip", "./src_dir")
# 2. 解压zip文件
with zipfile.ZipFile("压缩包.zip", "r") as zip_ref:
zip_ref.extractall("./解压目录")
光看不练可不行。下面整合三大库的核心功能,开发3个可以直接拿去用的实战脚本,覆盖日常高频的自动化场景。
批量修改文件夹内所有图片名称,统一格式为“序号+自定义前缀”:
from pathlib import Path
def batch_rename(folder_path, prefix="风景"):
"""批量重命名图片文件"""
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}")
# 调用
batch_rename("./photos", prefix="旅行照片")
自动识别文件后缀,把图片、文档、视频、压缩包分别丢进对应的文件夹去:
from pathlib import Path
import shutil
def classify_files(folder_path):
"""文件自动分类整理"""
path = Path(folder_path)
# 定义文件分类规则
classify_rule = {
"图片": [".jpg", ".png", ".jpeg", ".gif"],
"文档": [".txt", ".pdf", ".docx", ".xlsx"],
"压缩包": [".zip", ".rar", ".7z"],
"视频": [".mp4", ".a vi", ".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
# 调用
classify_files("./混合文件")
import shutil
from datetime import datetime
def zip_folder(folder_path):
"""批量压缩文件夹,命名带时间戳"""
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")
# 调用
zip_folder("./photos_processed")
业务需求 | 推荐库 | 核心原因 |
|---|---|---|
路径拼接、文件遍历、批量筛选 | pathlib | 代码简洁、跨平台、可读性极强 |
文件读写、判断文件属性 | pathlib | 极简API,无需手动管理文件句柄 |
系统环境获取、文件权限修改 | os | 专属系统级操作,无替代方案 |
兼容老旧Python项目 | os/os.path | 低版本Python不支持pathlib |
文件夹整体复制、递归删除 | shutil | 唯一支持批量文件夹操作的内置库 |
文件压缩、解压、批量迁移 | shutil+zipfile | 功能完善、开箱即用 |
1、优先使用pathlib:日常90%的文件路径、遍历、读写场景,pathlib都是最优选择。代码更优雅,跨平台兼容性也更好。
2、os作为补充:只有在需要系统级操作、兼容旧项目时,才翻它的牌子。
3、shutil处理批量复杂操作:文件夹复制、递归删除、压缩解压,它就是那个“救火队员”。
把这三大库组合起来使用,基本上可以横扫所有文件自动化场景。有了它们,那些重复的、枯燥的手工操作,就交给脚本去搞定吧。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8