Python实现文件/文件夹复制功能

 更新时间:2025年04月01日 08:59:35   作者:ak啊  
在数据处理和文件管理的日常工作中,我们经常需要复制文件夹及其子文件夹下的特定文件,手动操作不仅效率低下,而且容易出错,因此,使用编程语言自动化这一任务显得尤为重要,所以本文给大家介绍了使用Python实现文件/文件夹复制功能,需要的朋友可以参考下

一、基础工具库介绍

Python标准库中的shutil模块是主要工具:

import shutil
import os

二、文件复制基础

1. 复制单个文件

# 保留元数据(修改时间等)
shutil.copy2('source.txt', 'destination.txt')

# 仅复制内容
shutil.copy('source.txt', 'backup/')  # 自动保留文件名

# 文件流方式(适合大文件)
with open('source.txt', 'rb') as src, open('dest.txt', 'wb') as dst:
    shutil.copyfileobj(src, dst, length=16*1024)  # 16KB缓冲区

三、目录复制进阶

1. 简单目录复制

# 复制整个目录(目标目录必须不存在)
shutil.copytree('src_dir', 'dst_dir')

# 允许覆盖已存在目录(Python 3.8+)
shutil.copytree('src', 'existing_dir', dirs_exist_ok=True)

2. 自定义复制过程

def ignore_patterns(*patterns):
    def _ignore(path, names):
        ignored = []
        for pattern in patterns:
            ignored.extend(fnmatch.filter(names, pattern))
        return set(ignored)
    return _ignore

# 排除.pyc文件和临时文件
shutil.copytree('src', 'dst', ignore=ignore_patterns('*.pyc', '*.tmp'))

# 带进度回调的复制
def copy_progress(src, dst, *, follow_symlinks=True):
    print(f"Copying {src} => {dst}")

shutil.copytree('src', 'dst', copy_function=copy_progress)

四、高级自定义实现

当需要完全控制复制流程时,可以手动实现:

def deep_copy(src, dst, symlinks=False):
    if not os.path.exists(dst):
        os.makedirs(dst)
        shutil.copystat(src, dst)
    
    for item in os.listdir(src):
        src_path = os.path.join(src, item)
        dst_path = os.path.join(dst, item)
        
        if os.path.isdir(src_path):
            deep_copy(src_path, dst_path, symlinks)
        else:
            if os.path.exists(dst_path):
                if os.path.samefile(src_path, dst_path):
                    continue
                os.remove(dst_path)
            if symlinks and os.path.islink(src_path):
                linkto = os.readlink(src_path)
                os.symlink(linkto, dst_path)
            else:
                shutil.copy2(src_path, dst_path)

五、异常处理要点

try:
    shutil.copytree('src', 'dst')
except shutil.Error as e:
    print(f'Directory not copied. Error: {e}')
except OSError as e:
    print(f'OSError: {e.strerror}')

六、性能优化建议

  • 批量小文件:使用shutil.copytree的默认实现
  • 超大文件:使用copyfileobj分块复制
  • 网络存储:增加缓冲区大小(例如16*1024*1024即16MB)
  • 并行处理:对独立子目录使用多线程/多进程

七、完整示例代码

import shutil
import os
from pathlib import Path

def smart_copy(src, dst, overwrite=False, ignore=None):
    """智能复制器"""
    src = Path(src)
    dst = Path(dst)

    if src.is_file():
        if dst.is_dir():
            dst = dst / src.name
        if dst.exists():
            if overwrite:
                dst.unlink()
            else:
                raise FileExistsError(f"{dst} already exists")
        shutil.copy2(str(src), str(dst))
        return

    if not src.is_dir():
        raise ValueError("Source path invalid")

    if dst.exists():
        if overwrite:
            if dst.is_dir():
                shutil.rmtree(dst)
            else:
                dst.unlink()
        else:
            raise FileExistsError(f"{dst} already exists")

    shutil.copytree(
        str(src),
        str(dst),
        symlinks=True,
        ignore=ignore,
        copy_function=shutil.copy2,
        dirs_exist_ok=overwrite
    )

# 使用示例
smart_copy(
    '/data/project',
    '/backup/project_2024',
    overwrite=True,
    ignore=shutil.ignore_patterns('*.log', 'temp')
)

关键点说明:

  • 使用copy2而不是copy可以保留文件元数据
  • Path对象比字符串路径更安全易用
  • dirs_exist_ok参数需要Python 3.8+
  • 自定义ignore模式支持复杂过滤逻辑
  • 完善的异常处理保证操作可靠性

这种方法可以处理以下复杂场景:

  • 混合文件类型(普通文件/符号链接/特殊文件)
  • 保留所有文件属性
  • 覆盖已有内容的安全处理
  • 灵活的过滤机制
  • 跨平台兼容性(Windows/Unix)

以上就是Python实现文件/文件夹复制功能的详细内容,更多关于Python文件/文件夹复制的资料请关注脚本之家其它相关文章!

相关文章

  • 老生常谈Python进阶之装饰器

    老生常谈Python进阶之装饰器

    下面小编就为大家带来一篇老生常谈Python进阶之装饰器。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Python实现类的创建与使用方法示例

    Python实现类的创建与使用方法示例

    这篇文章主要介绍了Python实现类的创建与使用方法,结合简单计算器功能实例分析了Python类的定义与使用方法,需要的朋友可以参考下
    2017-07-07
  • Python中常见路径算法的原理与实现详解

    Python中常见路径算法的原理与实现详解

    在计算机科学中,路径算法是解决许多实际问题的核心工具,本文介绍了Python中三种常见的路径算法及其实现,帮助读者快速上手并理解这些算法的原理和应用
    2026-04-04
  • NetworkX之Prim算法(实例讲解)

    NetworkX之Prim算法(实例讲解)

    下面小编就为大家分享一篇NetworkX之Prim算法实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • python快速编写单行注释多行注释的方法

    python快速编写单行注释多行注释的方法

    在本篇文章里小编给大家整理的是关于python快速编写单行注释多行注释的方法,有此需要的朋友们可以参考学习下。
    2019-07-07
  • Python从Manim中提取表格/坐标系并转GIF的四种高效方案

    Python从Manim中提取表格/坐标系并转GIF的四种高效方案

    在数据可视化和数学动画创作中,我们经常需要将 Manim 动画中的表格、坐标系等核心元素单独导出为 GIF,本文整理了四种高效方案,每种方案仅提供核心代码,聚焦关键实现逻辑,需要的朋友可以参考下
    2025-08-08
  • Python中@符号的具体使用

    Python中@符号的具体使用

    本文主要介绍了Python中@符号的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • python按顺序重命名文件并分类转移到各个文件夹中的实现代码

    python按顺序重命名文件并分类转移到各个文件夹中的实现代码

    这篇文章主要介绍了python按顺序重命名文件并分类转移到各个文件夹中,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • python使用ctypes调用扩展模块的实例方法

    python使用ctypes调用扩展模块的实例方法

    在本篇文章里小编给大家整理的是一篇关于python使用ctypes调用扩展模块的实例方法内容,需要的朋友们可以学习参考下。
    2020-01-01
  • python安装pywifi全过程

    python安装pywifi全过程

    这篇文章主要介绍了python安装pywifi全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论