在日常办公和数据处理中,我们经常需要将文件从一个目录移动到另一个指定目录,手动操作不仅繁琐,还容易出错(尤其是批量移动场景)。python 提供了多种简洁高效的实现方案,本文将详细介绍文件移动的核心方法,并结合实际案例实现批量文件移动。
一、核心模块介绍
python 实现文件移动主要依赖两个核心模块,各自有不同的适用场景:
shutil模块:python 标准库中的高级文件操作模块,提供了直接的文件/目录移动接口,兼容性好、使用简单,是文件移动的首选方案。os模块:python 基础文件操作模块,主要用于辅助获取文件路径、遍历目录等,通常与shutil配合使用(批量移动场景必备)。
二、单个文件移动实现
使用 shutil.move(src, dst) 是实现单个文件移动的核心函数,参数说明:
src:源文件路径(完整路径/相对路径均可,必须是具体文件,不能是目录)dst:目标路径,有两种情况:- 目标路径是目录(已存在):文件将被移动到该目录下,保持原文件名不变
- 目标路径是具体文件名称:文件移动后将被重命名为该名称
代码示例
import shutil
def move_single_file(src_file, dst_path):
"""
单个文件移动
:param src_file: 源文件完整路径/相对路径
:param dst_path: 目标目录/目标文件完整路径
"""
try:
# 执行文件移动
shutil.move(src_file, dst_path)
print(f"文件移动成功:{src_file} -> {dst_path}")
except filenotfounderror:
print(f"错误:源文件 {src_file} 不存在,或目标目录不存在")
except permissionerror:
print(f"错误:没有权限移动文件 {src_file}")
except exception as e:
print(f"未知错误:{e}")
# 调用示例1:目标路径为目录(文件保持原名)
if __name__ == "__main__":
source_file = "test.txt" # 源文件(当前目录下的test.txt)
target_dir = "./target_folder" # 目标目录(当前目录下的target_folder,需提前创建)
move_single_file(source_file, target_dir)
# 调用示例2:目标路径为文件(文件移动后重命名)
# source_file = "data.csv"
# target_file = "./target_folder/new_data.csv"
# move_single_file(source_file, target_file)
补充说明
- 使用前需确保目标目录已存在(若不存在,可通过
os.makedirs(dst_dir, exist_ok=true)自动创建) - 该方法支持跨磁盘分区移动文件(windows 系统下也可正常使用)
三、批量文件移动案例
批量文件移动的核心思路是:遍历源目录中的目标文件 → 逐个执行移动操作,以下提供 3 个实用案例,覆盖不同场景需求。
案例1:批量移动指定目录下的所有文件(不限类型)
需求:将 source_folder 下的所有文件(不包含子目录中的文件)批量移动到 target_folder 中。
import shutil
import os
def batch_move_all_files(src_dir, dst_dir):
"""
批量移动指定目录下的所有文件(不含子目录文件)
:param src_dir: 源目录路径
:param dst_dir: 目标目录路径
"""
# 1. 检查并创建目标目录(若不存在)
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
print(f"目标目录不存在,已自动创建:{dst_dir}")
# 2. 遍历源目录中的所有文件
for file_name in os.listdir(src_dir):
# 拼接源文件完整路径
src_file_path = os.path.join(src_dir, file_name)
# 判断是否为文件(排除子目录)
if os.path.isfile(src_file_path):
# 3. 执行移动(目标路径为目录,保持原文件名)
shutil.move(src_file_path, dst_dir)
print(f"已移动:{file_name}")
print("所有文件批量移动完成!")
# 调用示例
if __name__ == "__main__":
source_directory = "./source_files" # 源目录
target_directory = "./target_files" # 目标目录
batch_move_all_files(source_directory, target_directory)
案例2:批量移动指定类型的文件(按后缀名筛选)
需求:仅移动 source_folder 下的 .txt 和 .pdf 文件,其他类型文件不处理。
import shutil
import os
def batch_move_specified_type(src_dir, dst_dir, file_extensions):
"""
批量移动指定后缀名的文件
:param src_dir: 源目录路径
:param dst_dir: 目标目录路径
:param file_extensions: 要移动的文件后缀名列表(如 ['.txt', '.pdf'])
"""
# 检查并创建目标目录
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
print(f"自动创建目标目录:{dst_dir}")
# 遍历源目录
for file_name in os.listdir(src_dir):
# 筛选指定后缀名的文件(忽略大小写)
if any(file_name.lower().endswith(ext.lower()) for ext in file_extensions):
src_file_path = os.path.join(src_dir, file_name)
if os.path.isfile(src_file_path):
# 移动文件
shutil.move(src_file_path, dst_dir)
print(f"已移动指定类型文件:{file_name}")
print(f"指定类型({file_extensions})文件批量移动完成!")
# 调用示例
if __name__ == "__main__":
src_dir = "./source_files"
dst_dir = "./txt_pdf_target"
target_extensions = [".txt", ".pdf"] # 要移动的文件类型
batch_move_specified_type(src_dir, dst_dir, target_extensions)
案例3:递归批量移动(包含子目录中的目标文件)
需求:移动 source_folder 及其所有子目录下的 .jpg 图片文件,保持文件的相对目录结构(可选)。
import shutil
import os
def batch_move_recursive(src_dir, dst_dir, file_extension=".jpg"):
"""
递归遍历子目录,批量移动指定类型文件
:param src_dir: 源根目录路径
:param dst_dir: 目标根目录路径
:param file_extension: 要移动的文件后缀名
"""
# 遍历源目录及其所有子目录(递归遍历)
for root, dirs, files in os.walk(src_dir):
for file_name in files:
# 筛选指定后缀名文件
if file_name.lower().endswith(file_extension.lower()):
# 源文件完整路径
src_file_path = os.path.join(root, file_name)
# (可选)保持相对目录结构:拼接目标文件的相对路径
relative_path = os.path.relpath(root, src_dir)
target_sub_dir = os.path.join(dst_dir, relative_path)
if not os.path.exists(target_sub_dir):
os.makedirs(target_sub_dir)
# 移动文件到对应子目录
shutil.move(src_file_path, target_sub_dir)
print(f"已递归移动:{src_file_path} -> {target_sub_dir}")
print(f"递归批量移动 {file_extension} 文件完成!")
# 调用示例
if __name__ == "__main__":
source_root_dir = "./source_images"
target_root_dir = "./target_images"
batch_move_recursive(source_root_dir, target_root_dir, ".jpg")
四、常见问题与注意事项
- 目标目录不存在:使用
os.makedirs(dst_dir, exist_ok=true)可自动创建目录,exist_ok=true表示目录已存在时不报错。 - 文件重名冲突:若目标目录中已存在同名文件,
shutil.move()会直接覆盖原有文件(windows 系统下会提示确认,linux/mac 系统下直接覆盖)。如需避免覆盖,可在移动前判断目标文件是否存在:dst_file_path = os.path.join(dst_dir, file_name) if not os.path.exists(dst_file_path): shutil.move(src_file_path, dst_dir) else: print(f"目标目录已存在同名文件,跳过:{file_name}") - 路径格式问题:推荐使用
os.path.join()拼接路径,可自动适配 windows(\)和 linux/mac(/)的路径分隔符,避免手动拼接路径导致的错误。 - 权限问题:若程序提示
permissionerror,需检查源文件/目标目录的读写权限(windows 下可能是文件被占用,linux/mac 下可通过chmod命令修改权限)。
总结
- python 文件移动的核心是
shutil.move()函数,搭配os模块可实现灵活的路径处理和目录遍历。 - 单个文件移动直接使用
shutil.move(src, dst),需注意目标路径是目录还是具体文件名。 - 批量文件移动的关键是遍历源目录,可通过
os.listdir()(非递归)或os.walk()(递归)实现文件筛选。 - 实际使用中需处理目录不存在、文件重名、权限不足等异常情况,提升程序的健壮性。
到此这篇关于python实现单个或批量文件移动的示例代码的文章就介绍到这了,更多相关python 单个或批量文件移动内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论