pin_drop当前位置:知识文库 ❯ 图文
Python shutil.copy()详解 - 文件复制函数使用指南
概述
shutil.copy() 是 shutil 模块中最常用的文件复制函数,它将源文件的内容和权限模式复制到目标位置。copy() 复制文件内容和文件权限位(mode),但不复制文件的元数据(如创建时间、修改时间等)。如果目标是目录,则文件会被复制到该目录下,保持原文件名。
语法
代码示例
import shutil
shutil.copy(src, dst, *, follow_symlinks=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() 复制权限。
相关方法对比
小贴士
如果你需要复制大文件并希望控制内存使用,可以使用 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() 会复制链接本身而不是链接指向的文件。但此功能并非所有平台都支持。
本文涉及AI创作
内容由AI创作,请仔细甄别