pin_drop当前位置:知识文库 ❯ 图文

Python shutil.move详解 - 移动文件和目录的实用教程

一、概述

shutil.move() 用于移动文件或目录到目标位置。如果源和目标在同一文件系统上,move() 实际执行重命名操作(非常快);如果在不同文件系统上,则先复制后删除。move() 是实现文件重命名、目录迁移等操作的核心工具。


二、语法与参数说明

语法

代码示例

import shutil

shutil.move(src, dst, copy_function=copy2)

参数说明

参数 类型 默认值 说明
src str/PathLike 必填 源文件或目录路径
dst str/PathLike 必填 目标路径
copy_function callable 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 提高速度。


六、移动文件方法对比

对比项 move() os.rename() copy()+remove() copy2()+remove()
跨文件系统 支持 不支持 支持 支持
保留元数据 是(默认)
目录支持 支持 有限 需递归 需递归
原子操作 同FS时是

七、小结

  • 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 会移动符号链接本身,而不是链接指向的目标文件或目录。这在管理符号链接结构时非常有用。

标签: shutil move 文件移动 文件重命名 目录迁移 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python shutil.copy2详解 - 保留元数据的文件复制方法 下一篇: Python shutil.make_archive详解 - 目录打包归档教程

poll相关推荐