使用 shutil 操作文件
复制、移动和归档文件
使用 shutil 操作文件 是 CoddyKit 上的免费 Python Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
什么是 shutil?
shutil(命令行工具)模块提供高级文件操作:复制、移动、删除目录树以及创建归档。它基于 os,用于处理日常任务。
import shutil, os
os.makedirs('/tmp/shutil_demo', exist_ok=True)
with open('/tmp/shutil_demo/a.txt', 'w') as f:
f.write('hello')
print('created a.txt')复制文件
shutil.copy(src, dst)会将文件内容和权限位复制到新位置。
import shutil, os
os.makedirs('/tmp/shutil_demo', exist_ok=True)
with open('/tmp/shutil_demo/src.txt', 'w') as f:
f.write('data')
shutil.copy('/tmp/shutil_demo/src.txt', '/tmp/shutil_demo/copy.txt')
print(os.path.exists('/tmp/shutil_demo/copy.txt'))copy 与 copy2
shutil.copy2与 copy类似,但还会保留时间戳等元数据。当修改时间很重要时,请使用它。
import shutil, os
os.makedirs('/tmp/shutil_demo', exist_ok=True)
with open('/tmp/shutil_demo/m.txt', 'w') as f:
f.write('x')
shutil.copy2('/tmp/shutil_demo/m.txt', '/tmp/shutil_demo/m2.txt')
print('copied with metadata')复制整个目录树
shutil.copytree(src, dst)会递归复制整个目录。目标目录必须尚不存在(除非传入 dirs_exist_ok=True)。
import shutil, os
os.makedirs('/tmp/tree_src/sub', exist_ok=True)
with open('/tmp/tree_src/sub/f.txt', 'w') as f:
f.write('hi')
shutil.rmtree('/tmp/tree_dst', ignore_errors=True)
shutil.copytree('/tmp/tree_src', '/tmp/tree_dst')
print(os.path.exists('/tmp/tree_dst/sub/f.txt'))移动文件和文件夹
shutil.move(src, dst)会移动或重命名文件或目录。在 os.rename 会失败的跨文件系统场景中,它仍然有效。
import shutil, os
os.makedirs('/tmp/move_demo', exist_ok=True)
with open('/tmp/move_demo/old.txt', 'w') as f:
f.write('move me')
shutil.move('/tmp/move_demo/old.txt', '/tmp/move_demo/new.txt')
print(os.path.exists('/tmp/move_demo/new.txt'))删除目录树
shutil.rmtree(path)会删除一个目录及其中的所有内容。请谨慎使用,因为无法撤销。
import shutil, os
os.makedirs('/tmp/to_delete/inner', exist_ok=True)
shutil.rmtree('/tmp/to_delete')
print('exists after rmtree:', os.path.exists('/tmp/to_delete'))忽略错误与安全性
向 rmtree 传入 ignore_errors=True后,如果路径不存在就不会导致程序崩溃,这对于在全新运行前进行清理非常方便。
import shutil
shutil.rmtree('/tmp/never_existed', ignore_errors=True)
print('no error even though path was absent')创建归档
shutil.make_archive(base_name, format, root_dir)只需一次调用,就能将目录打包成 zip 或 tar 文件。
import shutil, os
os.makedirs('/tmp/arch_src', exist_ok=True)
with open('/tmp/arch_src/data.txt', 'w') as f:
f.write('archive me')
path = shutil.make_archive('/tmp/my_archive', 'zip', '/tmp/arch_src')
print('created', os.path.basename(path))提取归档
shutil.unpack_archive(filename, extract_dir)会执行相反的操作,将 zip 或 tar 文件展开到文件夹中。
import shutil, os
shutil.make_archive('/tmp/box', 'zip', '/tmp/arch_src')
shutil.unpack_archive('/tmp/box.zip', '/tmp/unpacked')
print(os.listdir('/tmp/unpacked'))查找可执行文件
shutil.which(name)会在系统的 PATH 中定位程序,类似于 Shell 的 which命令。它会返回完整路径或空值。
import shutil
print(shutil.which('python3'))
print(shutil.which('definitely_not_a_real_program'))磁盘使用情况
shutil.disk_usage(path)会报告包含该路径的文件系统的总字节数、已用字节数和可用字节数。
import shutil
usage = shutil.disk_usage('/')
print('total GB:', round(usage.total / 1e9, 1))
print('free GB:', round(usage.free / 1e9, 1))快速检查
测试您对 shutil 的理解。
回顾
您学会了使用 shutil 进行文件操作:
copy/copy2用于复制文件;copytree用于复制整个目录树。move用于重命名或移动;rmtree用于删除目录树。make_archive/unpack_archive用于处理 zip 和 tar 文件。which和disk_usage用于查询系统信息。
下一门课程:使用 argparse 构建命令行工具。
常见问题解答
「使用 shutil 操作文件」课时是免费的吗?
是的 — 「使用 shutil 操作文件」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「使用 shutil 操作文件」这节课中我会学到什么?
复制、移动和归档文件 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 shutil 操作文件」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 subprocess 运行命令
- 捕获输出
- 环境与 os 模块
- 使用 shutil 操作文件