Python办公11:定时自动同步重要文件夹至移动硬盘或云端
11备份专家——定时自动同步重要文件夹至移动硬盘或云端第二阶段文件管理与系统自动化9-15场景引入你的工作资料只存在电脑本地一旦硬盘损坏、电脑丢失或中勒索病毒几年的心血瞬间归零。专业的做法是定期备份把重要文件夹同步到移动硬盘或云端。手动复制粘贴容易忘记本节教你用 Python Windows 定时任务实现全自动备份。技术原理备份的核心是增量同步——只复制新增和修改的文件避免每次都全量拷贝。源文件夹工作资料 ↓ 对比差异 备份文件夹移动硬盘 ↓ 只复制变更 同步完成同步策略策略说明适用场景增量同步只复制新增/修改的文件日常备份推荐全量复制每次全部复制首次备份镜像同步备份端删除源端已删除的文件精确镜像差异备份只备份修改的部分节省空间大型文件环境准备pipinstallshutilshutil是 Python 内置模块无需额外安装。完整代码importosimportshutilimporttimefrompathlibimportPathfromdatetimeimportdatetime# 方案 1增量文件同步 defsync_folders(source_dir,backup_dir,log_fileNone): 将源文件夹增量同步到备份文件夹 参数: source_dir: 源文件夹路径原始文件 backup_dir: 备份文件夹路径目标位置 log_file: 日志文件路径可选 sourcePath(source_dir)backupPath(backup_dir)ifnotsource.exists():print(f错误源目录{source_dir}不存在)returnFalse# 创建备份目录backup.mkdir(parentsTrue,exist_okTrue)files_copied0files_updated0files_skipped0total_size0log_lines[]deflog(msg):print(msg)log_lines.append(msg)log(f[{datetime.now().strftime(%Y-%m-%d %H:%M:%S)}] 开始同步)log(f源目录:{source})log(f备份目录:{backup})log(-*50)# 遍历源目录所有文件forfile_pathinsource.rglob(*):iffile_path.is_file():# 计算相对路径rel_pathfile_path.relative_to(source)dest_pathbackup/rel_path# 判断是否需要复制need_copyFalseifnotdest_path.exists():need_copyTrueaction新增eliffile_path.stat().st_mtimedest_path.stat().st_mtime:need_copyTrueaction更新eliffile_path.stat().st_size!dest_path.stat().st_size:need_copyTrueaction大小变更ifneed_copy:# 确保目标目录存在dest_path.parent.mkdir(parentsTrue,exist_okTrue)try:shutil.copy2(str(file_path),str(dest_path))file_sizefile_path.stat().st_size total_sizefile_sizeifaction新增:files_copied1else:files_updated1log(f [{action}]{rel_path}({file_size/1024:.1f}KB))exceptExceptionase:log(f [失败]{rel_path}:{e})else:files_skipped1# 汇总报告log(-*50)log(f同步完成!)log(f新增文件:{files_copied})log(f更新文件:{files_updated})log(f跳过文件:{files_skipped})log(f总复制量:{total_size/1024/1024:.2f}MB)# 写入日志iflog_file:Path(log_file).parent.mkdir(parentsTrue,exist_okTrue)withopen(log_file,a,encodingutf-8)asf:f.write(\n.join(log_lines)\n\n)returnTrue# 方案 2打包压缩备份 defbackup_as_zip(source_dir,backup_dir): 将整个文件夹打包为带日期的 ZIP 压缩包 sourcePath(source_dir)backupPath(backup_dir)backup.mkdir(parentsTrue,exist_okTrue)date_strdatetime.now().strftime(%Y%m%d_%H%M%S)folder_namesource.name zip_namef{folder_name}_备份_{date_str}zip_pathshutil.make_archive(str(backup/zip_name),zip,str(source))file_sizeos.path.getsize(zip_path)/1024/1024print(f备份完成:{zip_path}({file_size:.2f}MB))returnzip_path# 方案 3保留多个历史版本 defversioned_backup(source_dir,backup_base_dir,keep_versions5): 保留多个历史版本的备份类似时间机器 参数: source_dir: 源目录 backup_base_dir: 备份根目录 keep_versions: 保留最近的几个版本 sourcePath(source_dir)backup_basePath(backup_base_dir)backup_base.mkdir(parentsTrue,exist_okTrue)# 按日期创建版本文件夹date_strdatetime.now().strftime(%Y%m%d_%H%M%S)version_dirbackup_base/fv{date_str}# 全量复制ifversion_dir.exists():shutil.rmtree(version_dir)shutil.copytree(str(source),str(version_dir))print(f已创建备份版本:{version_dir})# 清理旧版本保留最新的 keep_versions 个versionssorted(backup_base.iterdir())whilelen(versions)keep_versions:old_versionversions.pop(0)ifold_version.is_dir():shutil.rmtree(old_version)print(f已清理旧版本:{old_version})# 使用示例 if__name____main__:# 配置项SOURCErD:\工作资料BACKUPrE:\备份\工作资料# 方案 1增量同步sync_folders(SOURCE,BACKUP,log_filebackup_log.txt)# 方案 2打包压缩# backup_as_zip(SOURCE, rE:\备份)# 方案 3版本化备份保留 5 个版本# versioned_backup(SOURCE, rE:\备份\版本历史, keep_versions5)代码逐行解析1. 增量同步判断逻辑ifnotdest_path.exists():need_copyTrue# 新文件eliffile_path.stat().st_mtimedest_path.stat().st_mtime:need_copyTrue# 修改时间更新eliffile_path.stat().st_size!dest_path.stat().st_size:need_copyTrue# 大小变化三层判断确保新增文件、修改过的文件、大小变化的文件都会被复制。2. shutil.copy2 保留元数据shutil.copy2(str(file_path),str(dest_path))copy2与copy的区别copy2会同时复制文件的元数据修改时间、创建时间等保证备份文件的属性与源文件一致。3. 递归遍历forfile_pathinsource.rglob(*):.rglob(*)递归遍历所有子目录等价于os.walk()但使用pathlib的面向对象语法。进阶技巧技巧 1结合 Windows 任务计划程序实现定时备份创建一个.bat批处理文件echo off python D:\scripts\auto_backup.py打开任务计划程序 → 创建基本任务 → 设置触发器如每天 18:00→ 指定批处理文件。技巧 2备份完成后弹出通知importctypes# Windows 通知ctypes.windll.user32.MessageBoxW(0,备份完成,领慧备份助手,0x40)技巧 3只备份特定类型的文件# 只备份 .docx 和 .xlsx 文件ALLOWED_EXTENSIONS{.docx,.xlsx,.pdf}forfile_pathinsource.rglob(*):iffile_path.is_file()andfile_path.suffix.lower()inALLOWED_EXTENSIONS:# ... 同步逻辑常见问题Q1同步过程中断电/中断怎么办shutil.copy2是逐个文件复制的中断后重新运行脚本会自动跳过已完成的文件通过修改时间判断。Q2备份占用空间太大使用方案 3版本化备份配合keep_versions限制历史版本数量。或者使用zip压缩importzipfilewithzipfile.ZipFile(backup_path,w,zipfile.ZIP_DEFLATED)aszf:forfile_pathinsource.rglob(*):iffile_path.is_file():arcnamefile_path.relative_to(source)zf.write(file_path,arcname)Q3备份到网络驱动器/NAS路径使用 UNC 格式BACKUPr\\192.168.1.100\shared\backup\工作资料总结备份策略函数特点增量同步sync_folders()只复制变更速度快压缩打包backup_as_zip()一个 ZIP 文件方便传输版本保留versioned_backup()可回溯历史版本本节掌握了三种备份策略。推荐组合使用日常增量同步 每周压缩打包 保留 3-5 个版本。下一节预告12内容检索——搜索文件夹内数千个文档中的特定关键字