当前位置:首页 > Python > 正文

Python文件复制方法大全 - 详细教程与代码示例

Python文件复制方法大全

全面解析Python中各种文件复制技术,附带详细代码示例和性能比较

为什么需要学习Python文件复制?

文件操作是编程中的基础任务,Python提供了多种高效的文件复制方法。掌握这些技术对于数据处理、备份系统开发、批量文件操作等场景至关重要。

1 使用shutil模块(推荐)

Python的shutil模块提供了高级文件操作功能,是复制文件的首选方法。

1.1 shutil.copy() - 基本文件复制

复制文件内容及权限,但不保留元数据:

import shutil

# 复制文件
shutil.copy('source.txt', 'destination.txt')

# 复制到目录(保留原文件名)
shutil.copy('source.txt', '/path/to/directory/')

1.2 shutil.copy2() - 保留元数据

复制文件内容、权限和元数据(如创建时间、修改时间):

import shutil

# 复制文件并保留元数据
shutil.copy2('source.txt', 'destination_meta.txt')

1.3 shutil.copytree() - 复制整个目录

递归复制整个目录树:

import shutil

# 复制目录
shutil.copytree('source_directory', 'destination_directory')

2 使用os模块

os模块提供了底层操作系统接口,可用于文件复制操作。

2.1 os.system() - 调用系统命令

通过调用操作系统命令实现文件复制:

import os

# Windows系统
os.system('copy source.txt destination.txt')

# Linux/Mac系统
os.system('cp source.txt destination.txt')

2.2 os.sendfile() - 高效复制(Linux)

Linux系统下的高效文件复制方法:

import os

source_fd = os.open('source.txt', os.O_RDONLY)
dest_fd = os.open('destination.txt', os.O_WRONLY | os.O_CREAT)

# 获取源文件大小
file_size = os.path.getsize('source.txt')

# 使用sendfile复制
os.sendfile(dest_fd, source_fd, 0, file_size)

os.close(source_fd)
os.close(dest_fd)

3 使用文件流操作

通过读取源文件并写入目标文件实现复制,提供最大的灵活性。

3.1 基础文件流复制

with open('source.txt', 'rb') as src, open('destination.txt', 'wb') as dest:
    # 读取源文件并写入目标文件
    dest.write(src.read())

3.2 分块读取大文件

对于大文件,使用分块读取避免内存问题:

CHUNK_SIZE = 1024 * 1024  # 1MB

with open('large_source.dat', 'rb') as src, open('large_destination.dat', 'wb') as dest:
    while True:
        chunk = src.read(CHUNK_SIZE)
        if not chunk:
            break
        dest.write(chunk)

3.3 复制时修改内容

在复制过程中修改文件内容:

def process_content(chunk):
    """示例处理函数:将文本转换为大写"""
    return chunk.decode('utf-8').upper().encode('utf-8')

with open('source.txt', 'rb') as src, open('modified_destination.txt', 'wb') as dest:
    for line in src:
        processed_line = process_content(line)
        dest.write(processed_line)

4 方法比较与选择指南

方法 优点 缺点 适用场景
shutil.copy() 简单易用,跨平台 不保留元数据 快速文件复制
shutil.copy2() 保留元数据 速度稍慢 需要保留文件属性的场景
os.system() 直接使用系统功能 平台依赖,安全性风险 简单脚本,已知环境
文件流操作 灵活可控,支持大文件 代码较复杂 大文件处理或需要修改内容

性能建议

  • 对于小文件:shutil.copy() 是最佳选择
  • 对于大文件:使用分块读取的文件流操作
  • 需要保留元数据:使用 shutil.copy2()
  • 整个目录复制:使用 shutil.copytree()

5 高级场景与最佳实践

5.1 错误处理与重试机制

import shutil
import time

def copy_with_retry(src, dst, max_retries=3):
    retries = 0
    while retries < max_retries:
        try:
            shutil.copy2(src, dst)
            print(f"成功复制 {src} 到 {dst}")
            return True
        except Exception as e:
            print(f"复制失败: {e}. 重试 {retries+1}/{max_retries}")
            retries += 1
            time.sleep(2)  # 等待2秒后重试
    print(f"复制 {src} 失败,超过最大重试次数")
    return False

# 使用示例
copy_with_retry('source.txt', 'destination.txt')

5.2 复制进度显示

def copy_with_progress(src, dst, buffer_size=1024*1024):
    total_size = os.path.getsize(src)
    copied = 0
    
    with open(src, 'rb') as src_file, open(dst, 'wb') as dst_file:
        while True:
            chunk = src_file.read(buffer_size)
            if not chunk:
                break
            dst_file.write(chunk)
            copied += len(chunk)
            percent = (copied / total_size) * 100
            print(f"进度: {percent:.2f}% ({copied}/{total_size} 字节)", end='\r')
    
    print("\n复制完成!")

# 使用示例
copy_with_progress('large_file.iso', 'large_file_copy.iso')

5.3 复制后验证文件完整性

import hashlib

def verify_copy(src, dst):
    """通过哈希值验证复制后的文件完整性"""
    def file_hash(filename):
        hasher = hashlib.md5()
        with open(filename, 'rb') as f:
            while True:
                chunk = f.read(8192)
                if not chunk:
                    break
                hasher.update(chunk)
        return hasher.hexdigest()
    
    src_hash = file_hash(src)
    dst_hash = file_hash(dst)
    
    if src_hash == dst_hash:
        print("文件验证成功: 源文件和目标文件一致")
        return True
    else:
        print(f"文件验证失败! 源文件哈希: {src_hash}, 目标文件哈希: {dst_hash}")
        return False

# 使用示例
shutil.copy2('important.data', 'important_backup.data')
verify_copy('important.data', 'important_backup.data')

总结

Python提供了多种文件复制方法,各有适用场景:

  • 日常使用首选shutil模块 - 简单高效,功能丰富
  • 需要处理大文件使用分块读取 - 避免内存问题
  • 需要修改内容使用文件流操作 - 提供最大灵活性
  • 关键操作添加错误处理和验证 - 确保数据完整性

根据具体需求选择合适的方法,大多数情况下shutil.copy()和shutil.copy2()是最佳选择。

Python文件复制相关SEO关键词

Python复制文件, Python文件操作, shutil.copy, Python文件复制教程, Python文件操作指南, Python复制文件到另一个目录, Python复制大文件, Python文件操作示例, Python文件处理, Python文件备份, Python文件操作技巧, Python文件复制方法比较

发表评论