Python进阶 - os模块 操作系统路径与目录操作

👋 大家好,欢迎来到我的技术博客!
📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。
🎯 本文将围绕Python进阶这个话题展开,希望能为你带来一些启发或实用的参考。
🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获!
文章目录
🐍 Python进阶:os模块操作系统路径与目录操作 🌐
在使用Python进行文件和目录管理时,os 模块是开发者最常接触的核心模块之一。它提供了丰富的功能来与操作系统交互,尤其是在处理路径、目录创建、文件信息获取等方面表现得尤为强大。无论是开发脚本自动化任务,还是构建复杂的文件管理系统,掌握 os 模块的使用都至关重要。
💡 提示:
os模块是标准库的一部分,无需额外安装即可直接使用。它跨平台兼容性良好,支持Windows、macOS和Linux等主流操作系统。
📂 什么是 os 模块?
os 模块(Operating System interface)提供了一种统一的方式来访问操作系统服务。通过这个模块,我们可以执行诸如:
- 获取当前工作目录
- 创建、删除目录
- 列出目录内容
- 处理路径字符串(如拼接、分割)
- 获取文件属性(大小、权限、修改时间等)
这些功能对于编写可移植性强的脚本非常关键。例如,一个在Windows上运行良好的路径拼接代码,在Linux上可能因为反斜杠问题而失败。而 os.path 提供的函数能自动适配不同系统的路径分隔符。
✅ 推荐实践:永远不要手动拼接路径字符串(如 'folder' + '\\' + 'file.txt'),而是使用 os.path.join() 来保证跨平台兼容性。
🔗 路径操作:os.path 模块详解 🧩
✅ 1. os.path.join() —— 安全路径拼接
import os
# 错误做法(不推荐)
path = "data" + "\\" + "images" + "\\" + "photo.jpg"
# 正确做法(推荐)
path = os.path.join("data", "images", "photo.jpg")
print(path) # Windows: data\images\photo.jpg
# Linux/macOS: data/images/photo.jpg
🎯 优势:自动根据操作系统选择正确的路径分隔符(
\或/),避免因平台差异导致错误。
✅ 2. os.path.abspath() —— 获取绝对路径
import os
relative_path = "project/config.py"
absolute_path = os.path.abspath(relative_path)
print(absolute_path)
# 输出示例:/home/user/project/config.py (Linux/Mac)
# C:\Users\user\project\config.py (Windows)
📌 用途:当你需要将相对路径转换为绝对路径时非常有用,尤其在读取配置文件或资源文件时。
✅ 3. os.path.dirname() 与 os.path.basename() —— 分离目录与文件名
import os
file_path = "/home/user/docs/report.pdf"
directory = os.path.dirname(file_path)
filename = os.path.basename(file_path)
print(f"Directory: {directory}") # /home/user/docs
print(f"Filename: {filename}") # report.pdf
💡 应用场景:
- 从文件路径中提取目录,用于后续的文件夹操作。
- 批量处理文件时,按目录分类。
✅ 4. os.path.exists() 与 os.path.isfile() / os.path.isdir()
判断路径是否存在及类型:
import os
path = "example.txt"
if os.path.exists(path):
print("✅ 路径存在!")
if os.path.isfile(path):
print("📄 是一个文件")
elif os.path.isdir(path):
print("📁 是一个目录")
else:
print("❌ 路径不存在")
🔍 注意:os.path.exists() 只判断路径是否存在于文件系统中,但不会区分是文件还是目录。因此建议配合 isfile() 和 isdir() 使用。
✅ 5. os.path.splitext() —— 分离文件名与扩展名
import os
filename = "document_v2.pdf"
name, ext = os.path.splitext(filename)
print(f"Name: {name}") # document_v2
print(f"Extension: {ext}") # .pdf
🎯 实用场景:批量重命名文件、按后缀分类、生成新文件名等。
🗃️ 目录操作:创建、遍历与删除
✅ 1. os.mkdir() 与 os.makedirs() —— 创建单层或多层目录
import os
# 单层创建(如果父目录不存在会报错)
try:
os.mkdir("new_folder")
except FileExistsError:
print("📁 目录已存在")
# 多层创建(推荐使用)
os.makedirs("project/data/raw/images", exist_ok=True)
print("✅ 成功创建嵌套目录结构")
⚠️
exist_ok=True参数可防止目录已存在时报错,是生产环境中的最佳实践。
✅ 2. os.listdir() —— 列出目录内容
import os
# 获取当前目录下所有文件和子目录
contents = os.listdir(".")
for item in contents:
print(f"📦 {item}")
📊 输出示例:
📦 README.md
📦 data/
📦 scripts/
📦 main.py
💡 技巧:结合 os.path.join() 遍历子目录:
for root, dirs, files in os.walk("."):
for file in files:
full_path = os.path.join(root, file)
print(f"📄 {full_path}")
✅ 3. os.rmdir() 与 os.removedirs() —— 删除空目录
import os
# 只能删除空目录
os.rmdir("empty_folder") # 仅当目录为空时有效
# 递归删除整个目录树(必须为空)
os.removedirs("nested/empty/dir")
⚠️ 警告:如果目录非空,会抛出异常。若要删除非空目录,应先清空内容。
✅ 4. shutil.rmtree() —— 强力删除目录(推荐替代方案)
虽然 shutil 模块不属于 os,但它是 os 的重要补充,特别适合删除包含内容的目录。
import shutil
# 安全删除整个目录及其内容
shutil.rmtree("temp_data", ignore_errors=True)
print("🗑️ 已成功删除 temp_data 目录及其所有子内容")
✅
ignore_errors=True表示即使某些文件无法删除也不中断程序,适用于清理临时文件。
🔄 遍历目录树:os.walk() 的深度解析
os.walk() 是一个强大的生成器函数,能够递归遍历目录树,返回 (root, dirs, files) 三元组。
import os
for root, dirs, files in os.walk("project"):
level = root.replace("project", "").count(os.sep)
indent = "│ " * level
print(f"{indent}📁 {os.path.basename(root)}")
sub_indent = "│ " * (level + 1)
for file in files:
print(f"{sub_indent}📄 {file}")
📊 输出效果(模拟):
📁 project
│ 📁 src
│ │ 📄 main.py
│ │ 📄 utils.py
│ 📁 tests
│ │ 📄 test_main.py
│ 📄 README.md
🧠 核心理解:
root:当前遍历的目录路径dirs:该目录下的子目录列表files:该目录下的文件列表
📌 应用场景:
- 文件搜索(如查找
.log文件) - 批量处理(如压缩所有图片)
- 系统扫描(如检查重复文件)
📊 文件属性查询:os.stat() 与时间戳处理
os.stat() 返回文件的详细信息,包括大小、权限、修改时间等。
import os
import time
file_path = "example.txt"
stats = os.stat(file_path)
print(f"📏 Size: {stats.st_size} bytes")
print(f"📅 Modified: {time.ctime(stats.st_mtime)}")
print(f"📅 Created: {time.ctime(stats.st_ctime)}")
print(f"🔧 Permissions: {oct(stats.st_mode)}")
📌 常见字段说明:
| 字段 | 含义 |
|---|---|
st_size |
文件大小(字节) |
st_mtime |
最后修改时间(秒级时间戳) |
st_ctime |
创建时间(部分系统) |
st_mode |
文件权限模式 |
🌐 跨平台路径处理最佳实践
由于不同操作系统使用不同的路径分隔符,我们必须谨慎处理路径字符串。
❌ 错误示范
# Windows风格(危险!)
path = "data\\images\\logo.png"
# Linux/macOS风格(同样危险)
path = "data/images/logo.png"
✅ 正确做法
import os
# 推荐:使用 os.path.join()
path = os.path.join("data", "images", "logo.png")
# 或者使用 pathlib(更现代,但不在 os 模块内)
from pathlib import Path
path = Path("data") / "images" / "logo.png"
🌟 升级建议:对于新项目,考虑使用
pathlib模块,语法更直观、面向对象。
🧱 Mermaid 图表:目录结构可视化
下面是一个基于 os.walk() 实现的目录结构图,用 Mermaid 语法表示:
🟢 这个图表展示了典型的 Python 项目结构,你可以将其嵌入 Markdown、Jupyter Notebook、Obsidian 等支持 Mermaid 渲染的工具中。
💡 小贴士:在 VS Code 中安装“Markdown Preview Mermaid Support”插件,即可实时渲染。
🛠️ 实用脚本:批量重命名文件
假设我们有一个文件夹,里面全是 IMG_001.jpg 格式的照片,想要统一改为 photo_001.jpg。
import os
def rename_images(folder_path):
count = 1
for filename in os.listdir(folder_path):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
old_path = os.path.join(folder_path, filename)
new_name = f"photo_{count:03d}.jpg"
new_path = os.path.join(folder_path, new_name)
os.rename(old_path, new_path)
print(f"🔄 Renamed: {filename} → {new_name}")
count += 1
# 调用函数
rename_images("photos")
✅ 输出示例:
🔄 Renamed: IMG_001.jpg → photo_001.jpg
🔄 Renamed: IMG_002.jpg → photo_002.jpg
...
📌 安全建议:操作前备份原始文件,或添加确认逻辑。
🔒 权限与安全性注意事项
在处理文件和目录时,务必注意权限问题。
import os
path = "/etc/passwd" # 系统文件,普通用户无权访问
try:
os.access(path, os.R_OK) # 检查是否可读
print("✅ 可读")
except PermissionError:
print("🚫 无读取权限")
⚠️ 切记:不要在未验证权限的情况下尝试读写敏感路径,否则可能导致程序崩溃或安全漏洞。
📈 总结:os 模块核心能力一览
| 功能 | 函数 | 说明 |
|---|---|---|
| 路径拼接 | os.path.join() |
安全跨平台 |
| 绝对路径 | os.path.abspath() |
将相对路径转为绝对路径 |
| 分离目录与文件 | os.path.dirname(), os.path.basename() |
便于路径分析 |
| 判断存在性 | os.path.exists() |
基础校验 |
| 判断类型 | os.path.isfile(), os.path.isdir() |
区分文件与目录 |
| 分离扩展名 | os.path.splitext() |
处理文件后缀 |
| 创建目录 | os.makedirs() |
支持多层创建 |
| 删除目录 | shutil.rmtree() |
删除非空目录 |
| 遍历目录 | os.walk() |
递归遍历 |
| 获取文件信息 | os.stat() |
获取大小、时间等 |
📚 学习资源推荐
- 📘 Python官方文档 - os 模块
- 🎓 Real Python - Working with Files and Directories
- 🖥️ GeeksforGeeks - Python os Module Tutorial
- 🎵 YouTube: Python os module tutorial (5 min)
💬 学习建议:动手写几个脚本,比如“查找大于1MB的文件”、“备份指定目录”、“清理临时文件”,将理论转化为实战。
✅ 结语:掌握 os 模块,让脚本更强大!
os 模块虽看似简单,却是 Python 文件系统操作的基石。它不仅帮助我们实现基本的路径和目录管理,还为自动化、数据处理、系统维护等高级应用打下坚实基础。
🔑 记住三个关键词:
- 安全:永远使用
os.path.join(),避免硬编码路径 - 兼容:跨平台代码离不开
os模块的智能处理 - 健壮:加异常处理,确保程序稳定运行
🚀 从今天开始,用 os 模块写出更专业、更可靠的 Python 脚本!
🌟 小挑战:写一个脚本,自动扫描当前目录,找出所有
.py文件,并列出它们的大小和最后修改时间。
import os
import time
for root, _, files in os.walk("."):
for file in files:
if file.endswith(".py"):
path = os.path.join(root, file)
stat = os.stat(path)
size = stat.st_size
mtime = time.ctime(stat.st_mtime)
print(f"🐍 {file} | Size: {size}B | Modified: {mtime}")
🎉 你已经迈出了进阶的第一步!
✨ 愿你在 Python 的世界里,每一步都走得稳健,每一行代码都充满智慧。
🙌 感谢你读到这里!
🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
💡 如果本文对你有帮助,不妨 👍 点赞、📌 收藏、📤 分享 给更多需要的朋友!
💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿
🔔 关注我,不错过下一篇干货!我们下期再见!✨
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)