shutil:用于高级文件操作,如复制、移动、删除文件/目录等;openpyxl:用于读写 Excel(.xlsx)文件,支持公式、样式、图表等;os:提供与操作系统交互的功能,如路径操作、环境变量、文件系统访问等;subprocess:用于创建新进程、执行外部命令(如 shell 命令、可执行程序),并与其输入输出交互。
这些模块常联合用于自动化办公场景,例如:
- 用
os和shutil管理 Excel 文件的路径与备份; - 用
openpyxl处理数据读写与格式设置; - 用
subprocess调用外部工具(如pandoc转文档、git提交、或导出 PDF 等)。
shutil.copy()和shutil.copy2()都用于复制文件,但关键区别在于是否保留源文件的元数据(metadata):
✅
shutil.copy(src, dst):
复制文件内容和权限模式(mode)(如读写执行位),但不保留修改时间(mtime)、访问时间(atime)、创建时间(ctime)等时间戳,也不保留扩展属性(如 SELinux context、ACL 等)。✅
shutil.copy2(src, dst):
在copy()基础上,额外调用copystat(),尽可能保留源文件的所有元数据,包括:- 修改时间(
st_mtime) - 访问时间(
st_atime) - 权限模式(
st_mode) - 所有者与组(
st_uid,st_gid,需有相应权限) - (在支持的系统上)扩展属性、xattr、ACL 等(依赖底层
os.chown()/os.utime()/shutil.copystat()实现)
- 修改时间(
⚠️ 注意:
copy2()无法保证 100% 完全复刻所有元数据(例如 Windows 上的“创建时间”可能受限于 API 或目标文件系统);- 若目标路径已存在且为目录,两者行为一致(将文件复制到该目录下);若目标为文件,则覆盖;
- 二者均不复制目录——复制目录需用
shutil.copytree()。
示例:
importshutilimportos src="data.txt"shutil.copy(src,"copy_basic.txt")# 仅保留权限shutil.copy2(src,"copy_preserve.txt")# 保留时间戳 + 权限 + 更多元数据print("Original mtime:",os.path.getmtime(src))print("Copy2 mtime:",os.path.getmtime("copy_preserve.txt"))# 几乎相同