pin_drop当前位置:知识文库 ❯ 图文
Python shutil.move详解 - 移动文件和目录的实用教程
一、概述
shutil.move() 用于移动文件或目录到目标位置。如果源和目标在同一文件系统上,move() 实际执行重命名操作(非常快);如果在不同文件系统上,则先复制后删除。move() 是实现文件重命名、目录迁移等操作的核心工具。
二、语法与参数说明
语法
代码示例
import shutil
shutil.move(src, dst, copy_function=copy2)参数说明
返回值
返回目标路径字符串。
三、代码示例
示例1:移动文件
代码示例
import shutil
import os
# 创建源文件
with open('temp_file.txt', 'w') as f:
f.write('要移动的文件')
os.makedirs('target_dir', exist_ok=True)
# 移动文件到目录
result = shutil.move('temp_file.txt', 'target_dir')
print(f"移动到: {result}")
print(f"原文件存在: {os.path.exists('temp_file.txt')}")
print(f"目标文件存在: {os.path.exists('target_dir/temp_file.txt')}")
# 清理
shutil.rmtree('target_dir')输出:
代码示例
移动到: target_dir\temp_file.txt
原文件存在: False
目标文件存在: True示例2:移动并重命名
代码示例
import shutil
import os
with open('old_name.txt', 'w') as f:
f.write('重命名测试')
# 移动并重命名
result = shutil.move('old_name.txt', 'new_name.txt')
print(f"新路径: {result}")
print(f"旧文件存在: {os.path.exists('old_name.txt')}")
print(f"新文件存在: {os.path.exists('new_name.txt')}")
os.remove('new_name.txt')输出:
代码示例
新路径: new_name.txt
旧文件存在: False
新文件存在: True示例3:移动目录
代码示例
import shutil
import os
# 创建源目录
os.makedirs('src_project/src', exist_ok=True)
os.makedirs('src_project/tests', exist_ok=True)
with open('src_project/src/main.py', 'w') as f:
f.write('print("hello")')
with open('src_project/README.md', 'w') as f:
f.write('# Project')
# 移动整个目录
result = shutil.move('src_project', 'dst_project')
print(f"移动到: {result}")
print(f"原目录存在: {os.path.exists('src_project')}")
print(f"新目录存在: {os.path.exists('dst_project')}")
print(f"文件保留: {os.path.exists('dst_project/src/main.py')}")
# 清理
shutil.rmtree('dst_project')输出:
代码示例
移动到: dst_project
原目录存在: False
新目录存在: True
文件保留: True四、实际应用场景
-
日志归档:将处理完的日志文件移动到归档目录。
-
文件整理:按文件类型将文件移动到不同目录进行分类。
-
部署迁移:将构建产物从临时目录移动到部署目录。
五、注意事项
注意1:如果目标文件已存在,
move()会覆盖它。移动前应确认目标路径。
注意2:如果目标是目录且目录中已存在同名文件,移动操作会失败。应先删除或重命名目标文件。
注意3:跨文件系统移动大文件时,
move()需要先复制再删除,可能耗时较长。
提示:
move()的copy_function参数默认为copy2,跨文件系统移动时保留元数据。可改为copy提高速度。
六、移动文件方法对比
七、小结
-
shutil.move()移动文件或目录,同文件系统下为重命名操作 -
跨文件系统时先复制后删除,默认使用
copy2保留元数据 -
目标已存在时会被覆盖,使用前应确认
-
支持文件和目录的移动
八、练习题
练习1
编写一个函数,将指定目录下超过7天的文件移动到归档目录。
练习2
编写一个文件整理脚本,按扩展名将文件移动到对应的子目录(如 .py 移动到 python/,.txt 移动到 text/)。
练习3
对比 shutil.move() 和 os.rename() 在跨文件系统场景下的行为差异。
常见问题
shutil.move 和 os.rename 有什么区别?
os.rename 只能在同一文件系统内工作,无法跨文件系统移动文件。而 shutil.move 会自动检测文件系统,跨文件系统时先复制再删除源文件,兼容性更好。此外,move 还支持目录的递归移动。
move 会覆盖已存在的目标文件吗?
会的。如果目标文件已存在,move 会直接覆盖它。如果目标是目录且已存在同名文件,移动操作会失败。因此在使用 move 前应检查目标路径是否存在。
跨文件系统移动大文件为什么很慢?
跨文件系统时,move 无法执行原子重命名操作,必须先将整个文件内容复制到目标位置(默认使用 copy2 保留元数据),然后再删除源文件。对于大文件,复制操作需要较长时间。
可以自定义 move 使用的复制函数吗?
可以。move 函数有一个 copy_function 参数,默认为 copy2。如果需要提高跨文件系统移动的速度(不保留元数据),可以传入 shutil.copy;如果需要自定义复制逻辑,也可以传入自定义函数。
move 能移动符号链接吗?
可以。move 会移动符号链接本身,而不是链接指向的目标文件或目录。这在管理符号链接结构时非常有用。
本文涉及AI创作
内容由AI创作,请仔细甄别