如何用 Python 实现一个简单的文件拷贝工具

111 阅读3分钟

你可以使用 Python 实现一个简单的文件拷贝工具,利用内建的 shutil 模块。shutil 提供了高效的文件操作功能,包含文件复制和移动等操作。

1. 使用 shutil.copy 和 shutil.copy2

    shutil.copy(src, dst):将源文件(src)复制到目标路径(dst)。它仅复制文件内容和权限信息。

    shutil.copy2(src, dst):与 shutil.copy 类似,但它还会保留源文件的时间戳信息。

2. 进阶:拷贝目录(包括目录中的文件)

shutil.copytree(src, dst) 可以用来复制整个目录及其内容。

下面是一个简单的文件拷贝工具实现:

import shutil

import os

def copy_file(src, dst):

    """复制单个文件"""

    try:

        # 如果目标路径是一个目录,文件将被复制到该目录中

        if os.path.isdir(dst):

            dst = os.path.join(dst, os.path.basename(src))

        # 复制文件,保留元数据(如时间戳)

        shutil.copy2(src, dst)

        print(f"文件 '{src}' 成功复制到 '{dst}'")

    except Exception as e:

        print(f"文件复制失败: {e}")

def copy_directory(src, dst):

    """复制整个目录"""

    try:

        # 复制整个目录树

        shutil.copytree(src, dst)

        print(f"目录 '{src}' 成功复制到 '{dst}'")

    except Exception as e:

        print(f"目录复制失败: {e}")

示例:复制文件

copy_file('source_file.txt', 'destination_file.txt')

示例:复制目录

copy_directory('source_directory', 'destination_directory')

代码解释:

    复制单个文件:copy_file 函数通过 shutil.copy2 将源文件复制到目标路径。如果目标是一个目录,它会将文件复制到该目录中。

    复制整个目录:copy_directory 使用 shutil.copytree 来递归地复制整个目录及其内容。

3. 处理目录结构中的冲突

在实际操作中,如果目标文件已经存在,shutil.copy2 会覆盖它。如果你想避免这种情况,可以加入一些检查来防止覆盖。例如,检查目标文件是否存在,或者使用 os.path.exists() 来判断目标路径是否已经存在。

import shutil

import os

def copy_file_with_check(src, dst):

    """复制文件,避免覆盖目标文件"""

    if os.path.exists(dst):

        print(f"目标文件 '{dst}' 已存在,复制操作已被跳过。")

    else:

        shutil.copy2(src, dst)

        print(f"文件 '{src}' 成功复制到 '{dst}'")

示例:复制文件

copy_file_with_check('source_file.txt', 'destination_file.txt')

4. 进阶:增加进度条(可选)

如果要处理大量文件或大文件,可能会希望在复制过程中显示进度条。可以使用 tqdm 库来显示进度条。

from tqdm import tqdm

import shutil

import os

def copy_file_with_progress(src, dst):

    """显示进度条的文件复制"""

    try:

        # 获取文件大小

        total_size = os.path.getsize(src)

        # 打开源文件并创建目标文件

        with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:

            # 使用 tqdm 显示进度条

            for chunk in tqdm(iter(lambda: fsrc.read(1024 * 1024), b''), total=total_size // (1024 * 1024), unit='MB'):

                fdst.write(chunk)

        print(f"文件 '{src}' 成功复制到 '{dst}'")

    except Exception as e:

        print(f"文件复制失败: {e}")

示例:复制文件并显示进度条

copy_file_with_progress('large_file.txt', 'large_file_copy.txt')

总结

这个简单的工具涵盖了复制文件、复制目录以及进度条显示。你可以根据需求扩展功能,比如支持命令行参数、过滤特定文件类型、添加日志记录等。