0

0

Python文件系统操作实战_os与shutil综合使用【教程】

冷漠man

冷漠man

发布时间:2025-12-25 21:57:08

|

563人浏览过

|

来源于php中文网

原创

最稳的文件系统操作需直接使用os/shutil并明确函数边界:os.path.isdir()安全判目录,shutil.copy2()保留元数据,shutil.rmtree()递归删目录但需处理权限,os.walk()遍历时通过topdown控制修改顺序。

python文件系统操作实战_os与shutil综合使用【教程】

直接用 osshutil 做文件系统操作,不封装、不抽象,就是最稳的落地方式——但必须清楚每个函数的边界和副作用,否则删错目录、覆盖文件、权限丢失都是分分钟的事。

判断路径存在且是目录,别只用 os.path.exists()

os.path.exists() 只告诉你“这个路径有没有”,但可能是文件也可能是目录。真正想确认“它是个可遍历的目录”,得组合判断:

  • os.path.isdir(path) 才是安全的目录判定,它隐含了 exists 检查
  • os.path.isfile(path) 同理,专用于文件,不推荐用 exists + 后缀判断
  • 注意:符号链接默认不被 isdirisfile 认可,要判链接本身用 os.path.islink()
import os
path = "/tmp/data"
if os.path.isdir(path):
    print("可以安全调用 os.listdir()")
else:
    print("不是目录,别硬上")

shutil.copy()shutil.copy2() 的元数据差异很关键

复制文件时,默认 shutil.copy() 只保留内容和权限(mode),但不保留修改时间、访问时间、扩展属性等;而 shutil.copy2() 会尽可能复制所有元数据(包括 stat 信息)。

  • 备份、归档场景必须用 shutil.copy2(),否则时间戳全变成当前时间,影响增量逻辑
  • 跨文件系统复制时,copy2 仍可能丢部分扩展属性(如 SELinux context),需额外处理
  • 如果目标路径已存在且是目录,两个函数都会报 IsADirectoryError,不是静默覆盖
import shutil
shutil.copy2("/src/report.txt", "/dst/report.txt")  # 保留 mtime/atime

递归删除非空目录,优先选 shutil.rmtree(),但要注意权限陷阱

os.rmdir() 只能删空目录,真要删整个项目构建产物或缓存目录,必须用 shutil.rmtree()

拍我AI
拍我AI

AI视频生成平台PixVerse的国内版本

下载

立即学习Python免费学习笔记(深入)”;

  • 它默认忽略只读文件(比如 Git 生成的 .git/objects),靠内部的 onerror 回调处理
  • Windows 下若遇到正在被占用的文件(如日志被 tail 占着),会直接抛 PermissionError,无法自动跳过
  • 安全做法:加 ignore_errors=False(默认值),配合自定义 onerror 显式处理错误
import shutil
import os
<p>def handle_remove<em>error(func, path, </em>):
os.chmod(path, stat.S_IWRITE)
func(path)</p><p>shutil.rmtree("/tmp/build", onerror=handle_remove_error)

os.walk() 遍历时修改目录结构要小心 yield 顺序

os.walk() 是深度优先、自顶向下遍历,但如果你在循环里动态删子目录或重命名父目录,后续迭代行为不可靠。

  • 想安全清理某类文件(如所有 *.pyc),用 topdown=True(默认),并在进入子目录前先处理当前层文件
  • 想批量重命名目录名,必须用 topdown=False,确保先处理叶子节点,再向上改父名,避免路径失效
  • dirs 列表可原地修改(如 dirs[:] = [d for d in dirs if not d.startswith('_')]),这是控制遍历范围的唯一合法方式
for root, dirs, files in os.walk(".", topdown=True):
    for f in files:
        if f.endswith(".log"):
            os.remove(os.path.join(root, f))

真正难的不是写对一行代码,而是理解 shutil.rmtree() 为什么删不掉某个目录,或者 os.path.isdir() 在容器里返回 False 却没报错——这时候得看挂载选项、UID 映射、procfs 权限,而不是再翻文档。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

自建git服务器
自建git服务器

git服务器是目前流行的分布式版本控制系统之一,可以让多人协同开发同一个项目。本专题为大家提供自建git服务器相关的各种文章、以及下载和课程。

978

2023.07.05

git和svn的区别
git和svn的区别

git和svn的区别:1、定义不同;2、模型类型不同;3、存储单元不同;4、是否拥有全局版本号;5、内容完整性不同;6、版本库不同;7、克隆目录速度不同;8、分支不同。php中文网为大家带来了git和svn的相关知识、以及相关文章等内容。

580

2023.07.06

git撤销提交的commit
git撤销提交的commit

Git是一个强大的版本控制系统,它提供了很多功能帮助开发人员有效地管理和控制代码的变更,本专题为大家提供git 撤销提交的commit相关的各种文章内容,供大家免费下载体验。

275

2023.07.24

git提交错误怎么撤回
git提交错误怎么撤回

git提交错误撤回的方法:git reset head^:撤回最后一次提交,恢复到提交前状态。git revert head:创建新提交,内容与之前提交相反。git reset :使用提交的 sha-1 哈希撤回指定提交。交互式舞台区:标记要撤回的特定更改,然后提交,排除已撤回更改。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

568

2024.04.09

git怎么对比两个版本的文件内容
git怎么对比两个版本的文件内容

要对比两个版本的 git 文件,请使用 git diff 命令:git diff 比较工作树和暂存区之间的差异。git diff 比较两个提交或标签之间的差异。git diff 输出显示差异块,其中 + 表示添加的行,- 表示删除的行, 表示修改的行。可使用 gitkraken、meld、beyond compare 等可视化工具更直观地查看差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

533

2024.04.09

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1496

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1170

2023.07.27

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号