Python 中 shutil.copy 详解
shutil.copy(A, B)
是 Python 中用于复制文件的函数,属于 shutil
模块。其核心功能和行为如下:
功能解释
-
作用
将文件从源路径A
复制到目标路径B
,支持以下两种场景:B
是目录:将A
复制到目录B
中,保留原文件名。B
是文件路径:将A
复制到指定路径,并重命名为B
的文件名。
-
保留元数据
- 复制文件内容。
- 保留文件权限(如读/写/执行权限)。
- 不保留其他元数据(如创建时间、修改时间,需用
shutil.copy2()
保留)。
-
覆盖行为
- 若目标路径
B
已存在同名文件,直接覆盖,无警告。
- 若目标路径
-
路径要求
- 若目标目录不存在,抛出
FileNotFoundError
。 - 若源文件
A
不存在,抛出FileNotFoundError
。
- 若目标目录不存在,抛出
参数说明
A
:源文件路径(需是文件,不能是目录)。B
:目标路径(可以是文件或目录)。
示例
示例 1:复制到目录
import shutil
# 将 "src.txt" 复制到目录 "backup" 中,生成 "backup/src.txt"
shutil.copy("src.txt", "backup/")
- 若
backup
不存在,报错FileNotFoundError
。
示例 2:复制并重命名
import shutil
# 将 "src.txt" 复制为 "dest.txt"
shutil.copy("src.txt", "dest.txt")
- 若
dest.txt
已存在,直接覆盖。
示例 3:复制并保留权限
import os
import shutil
# 创建可执行文件
with open("script.py", "w") as f:
f.write("print('Hello')")
os.chmod("script.py", 0o755) # 设置权限为 rwxr-xr-x
# 复制文件(保留权限)
shutil.copy("script.py", "script_copy.py")
# 验证权限
print(oct(os.stat("script_copy.py").st_mode)[-3:]) # 输出 '755'
对比其他函数
函数 | 行为 |
---|---|
shutil.copy(A, B) | 复制文件内容 + 权限,目标可以是目录或文件路径,覆盖同名文件。 |
shutil.copyfile(A, B) | 仅复制文件内容,目标必须是文件路径,不保留权限。 |
shutil.copy2(A, B) | 复制文件内容 + 所有元数据(权限、时间戳等),目标可以是目录或文件路径。 |
常见错误
-
目标目录不存在
shutil.copy("src.txt", "non_existent_dir/") # FileNotFoundError
-
源文件不存在
shutil.copy("non_existent.txt", "dest/") # FileNotFoundError
-
复制目录(需用
shutil.copytree
)shutil.copy("my_folder/", "backup/") # IsADirectoryError
总结
shutil.copy(A, B)
是简单高效的文件复制工具,适用于需要保留权限但无需完整元数据的场景。使用时需确保路径合法,并注意覆盖风险。