在这里插入图片描述

👋 大家好,欢迎来到我的技术博客!
📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。
🎯 本文将围绕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 文件权限模式

🔗 参考文档:os.stat() 官方说明


🌐 跨平台路径处理最佳实践

由于不同操作系统使用不同的路径分隔符,我们必须谨慎处理路径字符串。

❌ 错误示范

# 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 语法表示:

project

src

tests

data

README.md

main.py

utils.py

main.py

test_main.py

raw

processed

image1.jpg

image2.png

result.json

🟢 这个图表展示了典型的 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() 获取大小、时间等

📚 学习资源推荐

💬 学习建议:动手写几个脚本,比如“查找大于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 的世界里,每一步都走得稳健,每一行代码都充满智慧。


🙌 感谢你读到这里!
🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
💡 如果本文对你有帮助,不妨 👍 点赞、📌 收藏、📤 分享 给更多需要的朋友!
💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿
🔔 关注我,不错过下一篇干货!我们下期再见!✨

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐