pin_drop当前位置:知识文库 ❯ 图文

Python shutil.copy()详解 - 文件复制函数使用指南

概述

shutil.copy()shutil 模块中最常用的文件复制函数,它将源文件的内容和权限模式复制到目标位置。copy() 复制文件内容和文件权限位(mode),但不复制文件的元数据(如创建时间、修改时间等)。如果目标是目录,则文件会被复制到该目录下,保持原文件名。


语法

代码示例

import shutil

shutil.copy(src, dst, *, follow_symlinks=True)

参数说明

参数 类型 默认值 说明
src str/PathLike 必填 源文件路径
dst str/PathLike 必填 目标路径(文件或目录)
follow_symlinks bool True 是否跟随符号链接

返回值

返回目标文件的路径字符串。


代码示例

示例1:复制到文件

代码示例

import shutil
import os

# 创建源文件
with open('original.txt', 'w', encoding='utf-8') as f:
    f.write('这是原始文件的内容')

# 复制到新文件
result = shutil.copy('original.txt', 'copied.txt')
print(f"复制结果: {result}")

# 验证内容
with open('copied.txt', 'r', encoding='utf-8') as f:
    print(f"副本内容: {f.read()}")

# 清理
os.remove('original.txt')
os.remove('copied.txt')

输出:

代码示例

复制结果: copied.txt
副本内容: 这是原始文件的内容

示例2:复制到目录

代码示例

import shutil
import os

# 创建目录和源文件
os.makedirs('src_dir', exist_ok=True)
os.makedirs('dst_dir', exist_ok=True)
with open('src_dir/report.txt', 'w', encoding='utf-8') as f:
    f.write('年度报告内容')

# 复制到目录(保持原文件名)
result = shutil.copy('src_dir/report.txt', 'dst_dir')
print(f"复制到: {result}")
print(f"文件存在: {os.path.exists('dst_dir/report.txt')}")

# 清理
shutil.rmtree('src_dir')
shutil.rmtree('dst_dir')

输出:

代码示例

复制到: dst_dir\report.txt
文件存在: True

示例3:批量复制文件

代码示例

import shutil
import os

# 创建测试文件
os.makedirs('source', exist_ok=True)
os.makedirs('backup', exist_ok=True)

files = ['config.yaml', 'data.json', 'readme.txt']
for filename in files:
    with open(f'source/{filename}', 'w', encoding='utf-8') as f:
        f.write(f'{filename} 的内容')

# 批量复制
copied = []
for filename in os.listdir('source'):
    src = os.path.join('source', filename)
    if os.path.isfile(src):
        dst = shutil.copy(src, 'backup')
        copied.append(dst)

print(f"已复制 {len(copied)} 个文件:")
for path in sorted(copied):
    print(f"  {path}")

# 清理
shutil.rmtree('source')
shutil.rmtree('backup')

输出:

代码示例

已复制 3 个文件:
  backup\config.yaml
  backup\data.json
  backup\readme.txt

实际应用场景

  • 文件备份:定期将重要文件复制到备份目录,保留文件权限。

  • 配置部署:将配置文件从模板目录复制到目标目录。

  • 批量文件处理:遍历源目录,将符合条件的文件复制到目标目录。


注意事项

注意1:copy() 会覆盖已存在的目标文件,不会提示确认。复制前应检查目标是否存在。

注意2:copy() 不保留文件的元数据(修改时间、访问时间等)。如需保留,使用 copy2()。

注意3:src 必须是文件路径,不能是目录。复制目录应使用 copytree()。

提示:copy() 等价于先调用 copyfile() 复制内容,再调用 copymode() 复制权限。


相关方法对比

对比项 copy() copy2() copyfile() copyfileobj()
复制内容
复制权限
复制元数据
参数类型 路径 路径 路径 文件对象
缓冲区控制 不支持 不支持 不支持 支持

小贴士

如果你需要复制大文件并希望控制内存使用,可以使用 shutil.copyfileobj() 并指定缓冲区大小。更多详情可参考:Python 官方 shutil.copy 文档


小结

  • 功能:shutil.copy() 复制文件内容和权限,不复制元数据

  • 目标:可以是文件路径或目录路径

  • 覆盖:目标文件已存在时会被覆盖

  • 元数据:需要保留元数据时使用 copy2()


练习题

练习1

编写一个函数 backup_file(src, backup_dir),将文件复制到备份目录,如果目标已存在则在文件名后添加时间戳。

练习2

编写一个脚本,遍历指定目录下的所有 .py 文件,将它们复制到另一个目录。

练习3

对比 copy() 和 copyfile() 的区别,编写代码验证权限是否被复制。

常见问题

shutil.copy() 可以复制目录吗?

不可以。copy() 只能复制文件,不能复制目录。如果需要复制整个目录树,应该使用 shutil.copytree() 函数。

shutil.copy() 会覆盖目标文件吗?

会。如果目标文件已存在,copy() 会直接覆盖它,不会发出任何警告。建议在复制前使用 os.path.exists() 检查目标是否存在。

copy() 和 copy2() 应该选哪个?

如果只需要复制文件内容和权限,使用 copy() 即可,性能更好。如果需要保留文件的元数据(修改时间、访问时间等),应该使用 copy2()。

follow_symlinks=False 是什么意思?

当 follow_symlinks=False 时,如果源文件是符号链接,copy() 会复制链接本身而不是链接指向的文件。但此功能并非所有平台都支持。

标签: shutil.copy 文件复制 Python教程 文件备份 批量复制 Python标准库

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python shutil模块详解 - 文件操作高级指南 下一篇: Python shutil.copy2详解 - 保留元数据的文件复制方法

poll相关推荐