Python os 模块与路径操作:从基础到实战应用
在 Python 开发中,文件和目录的操作是必不可少的技能。无论是数据处理、日志记录还是程序配置,都需要与文件系统交互。Python 的os
模块和os.path
子模块提供了丰富的接口,能够轻松实现目录创建、文件删除、路径处理等功能。本文将结合实例代码,详细讲解这些模块的核心用法。
一、路径基础:理解路径表示方式
在开始操作文件系统前,首先需要掌握路径的表示方法:
./
:表示当前目录(即运行脚本所在的目录)../
:表示上一级目录- 不同操作系统的路径分隔符不同(Windows 用
\
,Linux/macOS 用/
),可通过os.sep
获取当前系统的分隔符
二、os 模块核心功能:目录与文件操作
os
模块提供了直接与操作系统交互的功能,涵盖目录创建、查看、删除等常用操作。
1. 获取当前工作目录与路径分隔符
import os# 获取当前工作目录(绝对路径)
print(os.getcwd()) # 示例输出:C:\project\demo# 获取当前系统的路径分隔符(Windows为\,Linux/macOS为/)
print(os.sep) # 示例输出:\(Windows系统)
2. 目录创建:os.makedirs()
os.makedirs()
支持递归创建目录(即同时创建多级目录),无需手动逐级创建父目录。
# 递归创建单级子目录
os.makedirs('./data/sub3') # 在当前目录创建data目录,再在其中创建sub3目录# 递归创建多级子目录
os.makedirs('./data/b3/c5') # 创建data/b3/c5三级目录
注意:如果目录已存在,再次调用会报错。可添加exist_ok=True
参数避免错误:
os.makedirs('./data/sub3', exist_ok=True) # 目录存在时不报错
3. 目录查看:os.listdir()
与os.walk()
(1)os.listdir()
:查看单层目录
返回指定目录下的所有子目录和文件(仅显示一级,不递归)。
# 查看./data目录下的内容
print(os.listdir('./data'))
# 示例输出:['sub3', 'b3'](假设data目录下有这两个子目录)
(2)os.walk()
:递归遍历目录
os.walk()
是一个生成器,可递归遍历目录树,返回每个目录的三元组(当前目录路径, 子目录列表, 文件列表)
。
# 递归遍历./data目录
gen = os.walk('./data')# 第一次调用next():返回当前目录(data)的信息
print(next(gen))
# 示例输出:('./data', ['sub3', 'b3'], [])# 第二次调用next():返回第一个子目录(sub3)的信息
print(next(gen))
# 示例输出:('./data/sub3', [], [])# 第三次调用next():返回第二个子目录(b3)的信息
print(next(gen))
# 示例输出:('./data/b3', ['c5'], [])
实战:收集目录下所有文件名称
# 初始化文件列表
all_files = []# 遍历所有目录,收集文件
for root, dirs, files in os.walk('./data'):all_files.extend(files) # 将当前目录的文件添加到列表print(all_files) # 输出所有文件名称(如['111.py', '6.py'])
4. 目录与文件删除
(1)删除文件:os.remove()
# 先判断文件是否存在,避免报错
if os.path.exists('data/b3/c5/111.py'):os.remove('data/b3/c5/111.py') # 删除指定文件
(2)删除空目录:os.rmdir()
与os.removedirs()
os.rmdir()
:仅删除空的叶子目录(目录内无文件和子目录)。os.removedirs()
:递归删除空目录(从最深层开始,直到遇到非空目录为止)。
# 删除叶子目录(必须为空)
if os.path.exists('data/sub3/cc'):os.rmdir('data/sub3/cc')# 递归删除空目录(如删除c5后,若b3为空则继续删除b3)
if os.path.exists('data/b3/c5'):os.removedirs('data/b3/c5')
注意:如果目录非空(包含文件或子目录),删除会报错。删除非空目录需使用shutil.rmtree()
(需导入shutil
模块)。
三、os.path 模块:路径处理工具
os.path
模块提供了一系列路径处理函数,解决不同操作系统路径格式差异的问题,确保路径操作跨平台兼容。
1. 判断路径类型
os.path.isdir(path)
:判断是否为目录。os.path.isfile(path)
:判断是否为文件。
import os.path# 判断是否为目录
print(os.path.isdir('./data/sub3/test')) # 输出:False(假设test不存在)# 判断是否为文件
print(os.path.isfile('./data/sub3/6.py')) # 输出:True(假设文件存在)
2. 获取文件大小
os.path.getsize(path)
返回文件的大小(单位:字节)。
# 获取文件大小
print(os.path.getsize('./data/sub3/6.py')) # 示例输出:1024(表示1024字节)
3. 路径分割与拼接
os.path.split(path)
:将路径分割为(目录部分, 文件名)
。os.path.join(path1, path2, ...)
:拼接多个路径片段,自动使用当前系统的分隔符。
# 分割路径
print(os.path.split('./data/sub3/6.py'))
# 输出:('./data/sub3', '6.py')# 拼接路径
print(os.path.join(r'.\data\sub3', '6.py'))
# 输出:.\data\sub3\6.py(Windows系统)
# 或 ./data/sub3/6.py(Linux/macOS系统)
优势:os.path.join()
会自动适配系统分隔符,避免手动写死/
或\
导致的跨平台问题。
四、实战场景与最佳实践
常见应用场景:
- 日志文件管理:创建按日期分类的日志目录(如
./logs/2025-07
)。 - 数据备份:遍历指定目录,复制或压缩所有文件。
- 程序初始化:启动时创建必要的配置目录(如
./config
、./cache
)。
- 日志文件管理:创建按日期分类的日志目录(如
最佳实践:
- 路径操作优先使用
os.path
模块,避免硬编码分隔符(如/
或\
)。 - 删除文件 / 目录前务必检查是否存在(用
os.path.exists()
),避免报错。 - 递归遍历目录时,使用
os.walk()
的生成器特性,减少内存占用。 - 处理大型目录时,结合
try-except
捕获权限不足等异常:
- 路径操作优先使用
try:os.makedirs('./data/sub3')
except PermissionError:print("无权限创建目录")
五、总结
os
和os.path
模块是 Python 文件系统操作的核心工具,通过本文的学习,你已掌握:
- 目录的创建、查看、删除(
os.makedirs()
、os.walk()
、os.remove()
等)。 - 路径的判断、分割、拼接(
os.path.isdir()
、os.path.join()
等)。 - 跨平台路径处理的最佳实践。