Python实现单个或批量文件移动的示例代码

 更新时间:2025年12月29日 09:10:48   作者:小满大王i  
日常办公和数据处理中,我们经常需要将文件从一个目录移动到另一个指定目录,本文就来介绍一下Python实现单个或批量文件移动,具有一定的参考价值,感兴趣的可以了解一下

在日常办公和数据处理中,我们经常需要将文件从一个目录移动到另一个指定目录,手动操作不仅繁琐,还容易出错(尤其是批量移动场景)。Python 提供了多种简洁高效的实现方案,本文将详细介绍文件移动的核心方法,并结合实际案例实现批量文件移动。

一、核心模块介绍

Python 实现文件移动主要依赖两个核心模块,各自有不同的适用场景:

  1. shutil 模块:Python 标准库中的高级文件操作模块,提供了直接的文件/目录移动接口,兼容性好、使用简单,是文件移动的首选方案。
  2. os 模块:Python 基础文件操作模块,主要用于辅助获取文件路径、遍历目录等,通常与 shutil 配合使用(批量移动场景必备)。

二、单个文件移动实现

使用 shutil.move(src, dst) 是实现单个文件移动的核心函数,参数说明:

  • src:源文件路径(完整路径/相对路径均可,必须是具体文件,不能是目录)
  • dst:目标路径,有两种情况:
    1. 目标路径是目录(已存在):文件将被移动到该目录下,保持原文件名不变
    2. 目标路径是具体文件名称:文件移动后将被重命名为该名称

代码示例

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")

四、常见问题与注意事项

  1. 目标目录不存在:使用 os.makedirs(dst_dir, exist_ok=True) 可自动创建目录,exist_ok=True 表示目录已存在时不报错。
  2. 文件重名冲突:若目标目录中已存在同名文件,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}")
    
  3. 路径格式问题:推荐使用 os.path.join() 拼接路径,可自动适配 Windows(\)和 Linux/Mac(/)的路径分隔符,避免手动拼接路径导致的错误。
  4. 权限问题:若程序提示 PermissionError,需检查源文件/目标目录的读写权限(Windows 下可能是文件被占用,Linux/Mac 下可通过 chmod 命令修改权限)。

总结

  1. Python 文件移动的核心是 shutil.move() 函数,搭配 os 模块可实现灵活的路径处理和目录遍历。
  2. 单个文件移动直接使用 shutil.move(src, dst),需注意目标路径是目录还是具体文件名。
  3. 批量文件移动的关键是遍历源目录,可通过 os.listdir()(非递归)或 os.walk()(递归)实现文件筛选。
  4. 实际使用中需处理目录不存在、文件重名、权限不足等异常情况,提升程序的健壮性。

到此这篇关于Python实现单个或批量文件移动的示例代码的文章就介绍到这了,更多相关Python 单个或批量文件移动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 的 openpyxl模块 读取 Excel文件的方法

    python 的 openpyxl模块 读取 Excel文件的方法

    这篇文章主要介绍了python 的 openpyxl模块 读取 Excel文件的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 介绍Python中的一些高级编程技巧

    介绍Python中的一些高级编程技巧

    这篇文章主要介绍了介绍Python中的一些高级编程技巧,包括推导师和装饰器等重要的进阶知识点,皆为深入学习Python开发的必备基本功,需要的朋友可以参考下
    2015-04-04
  • 一文详解Python中logging模块的用法

    一文详解Python中logging模块的用法

    logging是Python标准库中记录常用的记录日志库,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等。本文主要来和大家聊聊它的具体用法,希望对大家有所帮助
    2023-02-02
  • python重试装饰器的简单实现方法

    python重试装饰器的简单实现方法

    今天小编就为大家分享一篇python重试装饰器的简单实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python易忽视知识点小结

    Python易忽视知识点小结

    这篇文章主要介绍了Python易忽视知识点,实例分析了Python中容易被忽视的常见操作技巧,需要的朋友可以参考下
    2015-05-05
  • python解决字符串倒序输出的问题

    python解决字符串倒序输出的问题

    今天小编就为大家分享一篇python解决字符串倒序输出的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python3实现zabbix告警推送钉钉的示例

    python3实现zabbix告警推送钉钉的示例

    今天小编就为大家分享一篇python3实现zabbix告警推送钉钉的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Django celery的替代品Dramatiq使用特性详解

    Django celery的替代品Dramatiq使用特性详解

    这篇文章主要为大家介绍了Django celery的替代品Dramatiq使用特性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 如何在pycharm安装torch包

    如何在pycharm安装torch包

    这篇文章主要介绍了如何在pycharm安装torch包方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • PySpark和RDD对象最新详解

    PySpark和RDD对象最新详解

    Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、PB乃至EB级别的海量数据,PySpark是由Spark官方开发的Python语言第三方库,本文重点介绍PySpark和RDD对象,感兴趣的朋友一起看看吧
    2023-01-01

最新评论