我的知识记录

Python文件备份到另一目录教程:shutil一键同步

用Python shutil和pathlib把指定目录下的文件批量备份到另一目录,自动创建目标目录、保留修改时间,完整代码可运行。

场景痛点

每天下班前要把当天处理的报表、合同从工作盘复制到备份盘,手动选文件、粘贴、等进度条,遇到同名文件还要判断是否覆盖。文件一多,漏备或覆盖错版本的风险很高。用Python写个备份脚本,指定源和目标,跑一次就把最新文件全部同步过去。

用到的库

shutil    # 标准库,高级文件操作
pathlib   # 标准库

完整代码

import shutil
from pathlib import Path


def backup_files(source_dir: str, target_dir: str, overwrite: bool = True) -> dict:
"""
把source_dir下的所有文件递归备份到target_dir
:param source_dir: 源目录
:param target_dir: 备份目标目录
:param overwrite: 目标文件已存在时是否覆盖
:return: 备份统计
"""
src = Path(source_dir).resolve()
dst = Path(target_dir).resolve()
dst.mkdir(parents=True, exist_ok=True)

stats = {"copied": 0, "skipped": 0, "failed": 0}

for file in src.rglob('*'):
if not file.is_file():
continue

# 计算在目标目录中的对应路径
rel_path = file.relative_to(src)
target_file = dst / rel_path
target_file.parent.mkdir(parents=True, exist_ok=True)

if target_file.exists() and not overwrite:
stats["skipped"] += 1
continue

try:
# copy2 会同时复制文件内容和元数据(修改时间、权限)
shutil.copy2(file, target_file)
stats["copied"] += 1
except Exception as e:
stats["failed"] += 1
print(f"[失败] {file}: {e}")

print(f"备份完成:复制 {stats['copied']} 个,跳过 {stats['skipped']} 个,失败 {stats['failed']} 个")
return stats


if __name__ == "__main__":
backup_files(
source_dir="./workspace",
target_dir="/backup/workspace_20260914",
overwrite=True
)

代码讲解

  • shutil.copy2(src, dst):复制文件内容的同时保留元数据(修改时间、访问时间、权限位)。如果只复制内容不要元数据,用shutil.copy()
  • file.relative_to(src):计算源文件相对于源目录的相对路径,拼到目标目录下,保证目录结构原样还原。
  • target_file.parent.mkdir(parents=True, exist_ok=True):在复制每个文件前,先确保它的父目录存在,避免目录缺失导致复制失败。
  • rglob('*'):递归遍历所有子目录,包括深层嵌套的文件。

运行结果

运行后/backup/workspace_20260914/目录下会完整还原源目录的文件夹结构和文件。用资源管理器对比两边修改时间,copy2保留了原始时间戳,说明备份成功。

注意事项

  • copy2在Windows跨盘复制时如果遇到只读文件可能抛PermissionError,脚本里已捕获异常继续执行。
  • 如果源目录里有名为desktop.iniThumbs.db这类系统文件,备份过去会显得乱,可以在循环里加后缀或文件名过滤。
  • 备份目录名带上日期(如workspace_20260914),方便做历史快照。脚本每天定时跑一次,就能保留每天的版本。

Python文件备份到另一目录教程:shutil一键同步

标签:

更新时间:2026-09-14 21:31:37

上一篇:Python 批量给文件名加前缀后缀:分类标记一步到位

下一篇:Python Word转PDF:LibreOffice批量转换教程