Python 中如何复制文件?
Python 复制文件用标准库 shutil:copy() 复制内容和权限,copy2() 额外保留时间戳等元数据,copytree() 递归复制整个目录。本文对比各方法差异。
用标准库 shutil 模块:shutil.copy(src, dst) 复制文件;想完整保留修改时间等元数据用 shutil.copy2();复制整个目录树用 shutil.copytree()。
复制单个文件
import shutil
shutil.copy('/path/to/source/file', '/path/to/destination')
目标是目录时,文件会以原名复制进去;目标是文件路径时,会覆盖同名文件。
保留元数据:copy2
shutil.copy2('/path/to/source/file', '/path/to/destination')
copy2() 在复制内容之外,还尽量保留权限、修改时间、扩展属性等元数据。做备份时一般用 copy2()。
递归复制目录
shutil.copytree('/path/to/source/dir', '/path/to/dest/dir')
注意:目标目录必须不存在,否则抛 FileExistsError(Python 3.8+ 可加 dirs_exist_ok=True 允许合并)。
各函数对比
| 函数 | 复制内容 | 权限位 | 时间戳等元数据 |
|---|---|---|---|
copyfile() |
✓ | ✗ | ✗ |
copy() |
✓ | ✓ | ✗ |
copy2() |
✓ | ✓ | ✓ |
copytree() |
整个目录树 | ✓ | ✓ |
常见问题(FAQ)
Q:复制大文件时内存会不会爆?
A:不会。shutil 内部按固定大小的块流式读写,内存占用恒定。
Q:跨平台路径怎么处理?
A:配合 pathlib.Path 或 os.path.join() 构造路径,避免手写斜杠。
Q:复制过程中出错能捕获吗?
A:可以,常见异常有 FileNotFoundError(源不存在)、PermissionError(无权限)、shutil.SameFileError(源和目标相同),用 try/except 分别处理。