Python 文件路径操作指南:遍历、过滤与文件管理
在 Python 编程过程中,我们经常需要处理文件系统相关的任务。例如获取某一个目录下的所有文件、筛选特定后缀名的文件、获取文件所在的文件夹路径、替换文件名、删除文件或移动文件等。本文系统总结了这些方法,涵盖 模块和现代 库的使用,并包含错误处理与跨平台兼容性建议。
系统介绍了 Python 中处理文件路径的核心方法。涵盖使用 os 模块和 pathlib 库进行目录遍历、文件筛选、重命名、移动及删除等操作。内容包含递归搜索子目录、按后缀名过滤、跨平台路径拼接以及异常处理机制,旨在帮助开发者高效完成文件管理系统任务。

在 Python 编程过程中,我们经常需要处理文件系统相关的任务。例如获取某一个目录下的所有文件、筛选特定后缀名的文件、获取文件所在的文件夹路径、替换文件名、删除文件或移动文件等。本文系统总结了这些方法,涵盖 模块和现代 库的使用,并包含错误处理与跨平台兼容性建议。
ospathlibos.listdir() 是最基础的方法,可以获取指定文件夹下的所有文件和子文件夹名称(不包含完整路径)。
import os
dir_path = r'C:\Users\User\Desktop\周汇报'
file_ls = os.listdir(dir_path) # 获取所有文件及文件夹名称
print(file_ls)
运行结果会返回一个字符串列表,其中既包含文件名,也包含子文件夹名。
若要获取完整路径,可结合 os.path.join() 使用:
file_ls = [os.path.join(dir_path, file) for file in file_ls]
print(file_ls)
注意:此方法仅能获取当前层级的内容,无法递归进入子文件夹。
如果需要获取根目录下及其所有子文件夹中的文件,推荐使用 os.walk()。它返回三个参数:根目录 (root)、该目录下的子文件夹列表 (dirs)、该目录下的文件列表 (files)。
path = r'C:\Users\User\Desktop\周汇报'
for root, dirs, files in os.walk(path):
print(f"当前目录:{root}")
print(f"子文件夹:{dirs}")
print(f"文件:{files}")
os.walk 会自动向下遍历。若需收集所有文件路径:
path = r'C:\Users\User\Desktop\周汇报'
all_files = []
for root, dirs, files in os.walk(path):
for file in files:
full_path = os.path.join(root, file)
all_files.append(full_path)
print(f"共找到 {len(all_files)} 个文件")
Python 3.4+ 引入了 pathlib 模块,基于面向对象的方式处理路径,代码更简洁且可读性更强。
from pathlib import Path
p = Path(r'C:\Users\User\Desktop\周汇报')
print(p.exists()) # 检查是否存在
print(p.is_dir()) # 是否为目录
print(p.name) # 文件名或目录名
Path.glob() 和 Path.rglob() 是强大的通配符工具。
from pathlib import Path
# rglob 递归搜索所有匹配的文件
p = Path(r'C:\Users\User\Desktop\周汇报')
for file in p.rglob('*'):
if file.is_file():
print(file)
# 获取所有 .txt 文件
txt_files = list(p.rglob('*.txt'))
# 获取所有 .docx 文件
docx_files = list(p.rglob('*.docx'))
使用 os.path.splitext() 将路径分为两部分:主文件名和后缀名。
import os
file = r'C:\Users\User\Desktop\周汇报\第六周总结.pptx'
name, ext = os.path.splitext(file)
print(f"主名:{name}, 后缀:{ext}") # 输出:主名:...\第六周总结,后缀:.pptx
利用字符串的 endswith() 方法判断路径是否以特定字符结尾。
path = r'C:\Users\User\Desktop\周汇报\test.docx'
if path.endswith('.docx'):
print("这是一个 Word 文档")
使用 os.rename(old_name, new_name) 进行重命名。两个参数均为完整路径。
import os
old_path = r'C:\Users\User\Desktop\周汇报\旧文件.txt'
new_path = r'C:\Users\User\Desktop\周汇报\新文件.txt'
os.rename(old_path, new_path)
使用 shutil 模块的 move() 函数。如果目标目录不存在,可能会报错,需确保目标路径存在。
import shutil
src = r'C:\Users\User\Desktop\源文件.txt'
dst = r'C:\Users\User\Desktop\备份\目标文件.txt'
shutil.move(src, dst)
使用 os.remove(path) 删除单个文件。如果文件被占用或权限不足,会抛出异常。
import os
try:
os.remove(r'C:\Users\User\Desktop\临时文件.tmp')
print("文件已删除")
except FileNotFoundError:
print("文件不存在")
except PermissionError:
print("无权限删除")
使用 os.rmdir(path) 只能删除空文件夹,否则报错。
使用 shutil.rmtree(path) 可递归删除整个目录树。
import shutil
folder_path = r'C:\Users\User\Desktop\要删除的文件夹'
shutil.rmtree(folder_path)
使用 os.path.dirname(path) 或 pathlib.Path.parent 获取父目录路径。
import os
path = r'C:\Users\User\Desktop\周汇报\第 001 周总结.docx'
parent_dir = os.path.dirname(path)
print(parent_dir)
# 输出:C:\Users\User\Desktop\周汇报
Windows 使用反斜杠 \,Linux/Mac 使用正斜杠 /。建议使用 os.path.join() 或 pathlib 自动处理分隔符。
import os
path = os.path.join('data', 'reports', 'report.pdf')
# 在 Windows 上生成 data\reports\report.pdf
# 在 Linux 上生成 data/reports/report.pdf
文件操作极易受权限、路径不存在等因素影响,务必使用 try-except 块包裹关键逻辑。
在处理大量文件时,避免在循环中频繁调用 IO 操作。可使用生成器表达式或批量处理策略。对于超大目录,os.walk 比递归 listdir 更高效。
通过本文的学习,我们掌握了以下核心技能:
os.listdir 获取单层,os.walk 或 pathlib.rglob 获取递归。splitext 和 endswith 过滤特定类型文件。rename, move, remove, rmtree 等文件操作命令。pathlib 提高代码可读性,并通过异常处理增强程序健壮性。系统性掌握这些方法有助于编写高效的文件管理系统脚本,节约开发时间。在实际项目中,建议优先使用 pathlib 模块以获得更好的跨平台支持。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online