python 自动化从入门到实战-开发一个文件自动备份工具(7)
数据安全不用愁!这个Python工具让文件夹自动备份超简单
数据备份,为什么如此重要?
你有没有过这样的经历?辛辛苦苦整理的文档、照片突然找不到了?电脑坏了导致重要资料丢失?这些场景想想都让人头疼。数据备份就像给你的文件买了一份保险,即使发生意外,也能轻松恢复。
今天要给大家介绍一个超实用的Python工具——文件夹定时备份工具。它能帮你自动、定时地备份重要文件夹,还能存到局域网共享电脑上,让你的数据安全更上一层楼!
调用示例:
cd d:\PyStudy\MysqlManagerTool ; python folder_backup.py --source D:\PyStudy\GuShiJieLong --backup D:\PyStudy\自动备份文件夹 --schedule once
这个备份工具,能帮你做什么?
简单来说,这是一个用Python写的小工具,虽然体积不大,但功能可不少:
- 自动打包压缩:把整个文件夹里的所有文件和子文件夹都打包成一个ZIP文件
- 定时执行:想什么时候备份就什么时候备份,完全不用手动操作
- 局域网共享:备份文件可以自动复制到公司或家里的共享电脑上
- 旧备份清理:自动删除太老的备份文件,不会占满你的硬盘空间
- 详细记录:备份过程有日志记录,出了问题能轻松排查
- 跨平台:不管你用Windows、Mac还是Linux,都能正常使用
为什么要用这个工具?
可能有人会说:"我手动复制粘贴不也行吗?"确实可以,但这个工具的优势在于:
- 不会忘:设定好时间后,系统会自动执行,再也不会因为工作忙忘记备份
- 更安全:不仅本地有备份,还能同步到局域网其他电脑,双重保障
- 更高效:一键设置,一劳永逸,节省你的宝贵时间
- 更整洁:自动清理旧备份,保持存储空间整洁有序
核心功能详解
📁 递归压缩,一个都不漏
这个工具会把你指定的文件夹里的所有内容,包括子文件夹、孙子文件夹里的所有文件,都压缩成一个ZIP文件。压缩后的文件会自动加上时间戳,方便你区分不同时间的备份。
⏰ 定时任务,想什么时候备份就什么时候
你可以像设定闹钟一样设定备份时间,比如:
- 每天凌晨2点自动备份(适合上班族)
- 每周日晚上10点备份(适合学生党)
- 每6小时备份一次(适合重要项目)
工具使用的是标准的cron表达式,虽然看起来有点专业,但按照下面的格式填写就行:
分钟 小时 日 月 星期
举几个简单的例子:
0 0 * * *
:每天凌晨0点0分执行30 2 * * *
:每天凌晨2点30分执行0 */6 * * *
:每6小时执行一次0 9 * * 1-5
:周一至周五上午9点执行
🔄 网络共享,多一层保障
如果你家里或办公室有共享电脑,可以让工具自动把备份文件复制到共享文件夹里。这样即使你的电脑出问题,备份文件还在其他电脑上,安全系数大大提高!
在Windows系统中,共享路径通常长这样:\\服务器名称\共享文件夹\子文件夹
🗑️ 自动清理,不占硬盘空间
备份文件多了,硬盘空间就会被占满。这个工具会自动清理7天前的旧备份文件(天数可以在代码里调整),让你的硬盘始终保持清爽。
📝 详细日志,出问题能快速排查
工具会把备份过程中的所有操作都记录下来,包括什么时候开始、什么时候结束、有没有出错等。如果备份失败,你可以查看日志文件,快速找到问题所在。
手把手教你用:超简单的使用指南
第一步:准备工作
使用这个工具需要先安装Python,然后安装必要的依赖包。打开命令提示符(Windows)或终端(Mac/Linux),输入以下命令:
pip install -r requirements.txt
主要需要安装的是schedule
库,它是用来管理定时任务的。
第二步:基本使用方法
最简单的使用方式,就是在命令行里指定你要备份的文件夹路径:
python folder_backup.py --source "D:\需要备份的文件夹"
这样就会把D:\需要备份的文件夹
备份到当前目录下的backups
文件夹里,默认每天凌晨执行一次。
第三步:高级设置
如果你想自定义备份路径、定时时间等,可以使用更多参数:
python folder_backup.py --source "源文件夹路径" --backup "本地备份路径" --network "网络共享路径" --schedule "定时表达式" --log "日志文件路径"
参数说明:
--source
或-s
:必需,要备份的源文件夹路径--backup
或-b
:本地备份文件夹路径,默认为./backups
--network
或-n
:局域网共享文件夹路径(可选)--schedule
或-t
:定时任务表达式,默认为0 0 * * *
(每天凌晨)--log
或-l
:日志文件路径,默认为folder_backup.log
实用示例,拿走就用
示例1:每天备份一次项目代码
如果你是程序员,可以每天备份你的代码项目:
python folder_backup.py --source "D:\Projects\MyApp" --backup "D:\Backups\Code" --schedule "0 2 * * *"
这样每天凌晨2点,系统会自动备份你的代码到指定目录。
示例2:每周备份并同步到网络共享
如果你有重要文档需要异地备份,可以这样设置:
python folder_backup.py --source "D:\Documents" --backup "D:\LocalBackups" --network "\\fileserver\backup\documents" --schedule "0 3 * * 0"
这个命令会在每周日凌晨3点备份文档,同时复制到网络共享文件夹。
示例3:临时备份一次
如果你想立刻备份一次,不需要定时功能,可以这样:
python folder_backup.py --source "D:\ImportantData" --schedule "once"
这样工具会立即执行一次备份,然后退出。
常见问题解答
Q:备份时会不会占用很多系统资源?
A:备份过程中会有一定的CPU和内存占用,但一般不会影响电脑的正常使用。建议在电脑空闲时(比如凌晨)执行备份。
Q:如果备份过程中电脑关机了怎么办?
A:如果电脑关机,备份任务会中断。下次开机后需要手动重新启动备份服务,或者设置电脑自动开机并启动备份服务。
Q:访问局域网共享需要权限吗?
A:是的,访问网络共享文件夹通常需要相应的读写权限。请确保运行脚本的用户有足够的权限访问目标共享文件夹。
Q:我可以修改保留备份的天数吗?
A:当然可以!在代码中的cleanup_old_backups
函数里,有个days_to_keep=7
的参数,把7改成你想要的天数就行。
代码解析:工具是如何工作的?
为了让大家更深入地了解这个备份工具,我们来简单解析一下核心代码部分。即使你不懂Python,也能通过这个解析理解工具的工作原理。
🛠️ 工具的整体结构
这个工具的代码主要分为几个核心函数,每个函数负责一项具体的任务:
# 主要函数结构
def setup_logger(log_file): # 配置日志记录
def create_zip(source_dir, output_filename): # 创建压缩文件
def copy_to_network_share(source_file, network_path): # 复制到网络共享
def perform_backup(source_dir, backup_dir, network_share=None): # 执行备份任务
def cleanup_old_backups(backup_dir, days_to_keep=7): # 清理旧备份
def setup_scheduled_backup(source_dir, backup_dir, network_share=None, schedule_str='0 0 * * *'): # 设置定时任务
def main(): # 主函数,处理命令行参数
每个函数各司其职,共同完成备份任务。
📝 日志配置:记录每一步操作
def setup_logger(log_file='folder_backup.log'):"""设置日志记录器"""logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s',handlers=[logging.FileHandler(log_file), # 写入文件logging.StreamHandler() # 显示在屏幕上])return logging.getLogger('folder_backup')
这个函数负责配置日志系统,它会把备份过程中的所有操作都记录到日志文件中,同时在屏幕上显示。这样你就能清楚地知道备份是何时开始、何时结束,有没有遇到问题。
📁 递归压缩:把所有文件打包
def create_zip(source_dir, output_filename):"""递归压缩指定目录到ZIP文件"""try:with zipfile.ZipFile(output_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:# 遍历源目录下的所有文件和子目录for root, _, files in os.walk(source_dir):for file in files:file_path = os.path.join(root, file)arcname = os.path.relpath(file_path, os.path.dirname(source_dir))zipf.write(file_path, arcname)logger.info(f'成功创建压缩文件:{output_filename}')return Trueexcept Exception as e:logger.error(f'创建压缩文件失败:{str(e)}')return False
这个函数是备份的核心部分,它会:
- 创建一个ZIP压缩文件
- 遍历你指定的文件夹里的所有文件和子文件夹
- 把每个文件都添加到ZIP文件中
- 使用
ZIP_DEFLATED
压缩算法减小文件大小
注意那个os.walk()
函数,它就像一个"文件探测器",能帮我们找到文件夹里的所有内容,一个都不漏!
🔄 网络共享:多一份保障
def copy_to_network_share(source_file, network_path):"""将文件复制到局域网共享目录"""try:# 确保网络共享目录存在if not os.path.exists(network_path):logger.warning(f'网络共享目录不存在:{network_path}')return False# 复制文件dest_path = os.path.join(network_path, os.path.basename(source_file))shutil.copy2(source_file, dest_path)logger.info(f'成功复制文件到网络共享目录:{dest_path}')return Trueexcept Exception as e:logger.error(f'复制文件到网络共享目录失败:{str(e)}')return False
这个函数负责把备份好的ZIP文件复制到局域网共享文件夹。它会先检查共享目录是否存在,然后使用shutil.copy2()
函数进行复制。这个函数比普通的复制功能更强,它还会保留文件的元数据(如创建时间、修改时间等)。
⏰ 定时任务:自动执行的秘密
def setup_scheduled_backup(source_dir, backup_dir, network_share=None, schedule_str='0 0 * * *'):"""设置定时备份任务"""# 先执行一次备份perform_backup(source_dir, backup_dir, network_share)# 设置定时任务try:# 解析cron表达式parts = schedule_str.split()# 根据不同的表达式格式设置定时任务# ...省略具体解析代码...# 运行调度器while True:schedule.run_pending()time.sleep(60) # 每分钟检查一次except Exception as e:logger.error(f'设置定时任务失败:{str(e)}')
这个函数是实现定时备份的关键。它使用了schedule
库来管理定时任务:
- 首先会立即执行一次备份
- 然后根据你提供的cron表达式设置定时任务
- 最后进入一个无限循环,每分钟检查一次是否到了执行时间
这里的while True:
和time.sleep(60)
组合在一起,就像一个"守时的闹钟",每分钟检查一次是否该执行备份了。
🗑️ 自动清理:保持空间整洁
def cleanup_old_backups(backup_dir, days_to_keep=7):"""清理指定天数前的旧备份文件"""try:now = time.time()cutoff = now - (days_to_keep * 86400) # 86400秒 = 1天for file in os.listdir(backup_dir):file_path = os.path.join(backup_dir, file)if os.path.isfile(file_path):# 检查文件是否为ZIP备份文件if file.endswith('.zip') and 'backup' in file:# 检查文件的修改时间if os.path.getmtime(file_path) < cutoff:os.remove(file_path)logger.info(f'删除旧备份文件:{file_path}')except Exception as e:logger.error(f'清理旧备份文件失败:{str(e)}')
这个函数会帮你自动清理过期的备份文件:
- 计算出一个时间点(当前时间减去要保留的天数)
- 遍历备份文件夹里的所有文件
- 检查每个ZIP备份文件的修改时间
- 如果文件太旧(早于计算出的时间点),就删除它
注意这里的86400
,它是一天的秒数(60秒×60分钟×24小时)。通过这个简单的数学计算,我们就能知道哪些文件需要被清理了。
🎯 主函数:协调所有工作
def main():# 创建解析器parser = argparse.ArgumentParser(description='文件夹定时备份工具')# 添加命令行参数parser.add_argument('--source', '-s', required=True, help='要备份的源文件夹路径')parser.add_argument('--backup', '-b', default='./backups', help='本地备份文件夹路径,默认为./backups')# ...省略其他参数...# 解析命令行参数args = parser.parse_args()# 验证源文件夹是否存在if not os.path.exists(args.source):print(f'错误:源文件夹不存在:{args.source}')return# 全局变量:日志记录器global loggerlogger = setup_logger(args.log)# 启动定时备份服务setup_scheduled_backup(args.source, args.backup, args.network, args.schedule)
主函数是整个工具的入口,它负责:
- 解析你在命令行中输入的参数(如源文件夹、备份路径等)
- 验证源文件夹是否存在
- 设置日志系统
- 启动定时备份服务
通过这个简单的结构,整个工具就能有条不紊地工作了!
完整代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
文件夹定时备份工具
功能:递归压缩指定文件夹,并定时备份到局域网共享电脑
"""import os
import shutil
import zipfile
import time
import datetime
import schedule
import logging
import platform
import argparse
from pathlib import Path# 配置日志
def setup_logger(log_file='folder_backup.log'):"""设置日志记录器"""logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s',handlers=[logging.FileHandler(log_file),logging.StreamHandler()])return logging.getLogger('folder_backup')# 创建压缩文件
def create_zip(source_dir, output_filename):"""递归压缩指定目录到ZIP文件"""try:with zipfile.ZipFile(output_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:# 遍历源目录下的所有文件和子目录for root, _, files in os.walk(source_dir):for file in files:# 构建文件的完整路径file_path = os.path.join(root, file)# 计算文件在ZIP中的相对路径arcname = os.path.relpath(file_path, os.path.dirname(source_dir))# 添加文件到ZIP中zipf.write(file_path, arcname)logger.info(f'成功创建压缩文件:{output_filename}')return Trueexcept Exception as e:logger.error(f'创建压缩文件失败:{str(e)}')return False# 复制文件到局域网共享目录
def copy_to_network_share(source_file, network_path):"""将文件复制到局域网共享目录"""try:# 确保网络共享目录存在if not os.path.exists(network_path):# 在Windows上,可以使用UNC路径格式 \\server\share\path# 注意:创建网络共享目录可能需要特定权限logger.warning(f'网络共享目录不存在:{network_path}')return False# 复制文件dest_path = os.path.join(network_path, os.path.basename(source_file))shutil.copy2(source_file, dest_path)logger.info(f'成功复制文件到网络共享目录:{dest_path}')return Trueexcept Exception as e:logger.error(f'复制文件到网络共享目录失败:{str(e)}')return False# 执行备份任务
def perform_backup(source_dir, backup_dir, network_share=None):"""执行备份任务"""logger.info(f'开始备份任务:{source_dir}')# 确保备份目录存在if not os.path.exists(backup_dir):os.makedirs(backup_dir)logger.info(f'创建备份目录:{backup_dir}')# 生成带时间戳的备份文件名timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')source_name = os.path.basename(source_dir)backup_filename = f'{source_name}_backup_{timestamp}.zip'backup_path = os.path.join(backup_dir, backup_filename)# 创建压缩文件if create_zip(source_dir, backup_path):# 如果指定了网络共享目录,则复制到网络共享if network_share:copy_to_network_share(backup_path, network_share)# 清理旧备份(保留最近7天的备份)cleanup_old_backups(backup_dir)logger.info('备份任务完成')return Truelogger.error('备份任务失败')return False# 清理旧备份
def cleanup_old_backups(backup_dir, days_to_keep=7):"""清理指定天数前的旧备份文件"""try:now = time.time()cutoff = now - (days_to_keep * 86400) # 86400秒 = 1天for file in os.listdir(backup_dir):file_path = os.path.join(backup_dir, file)if os.path.isfile(file_path):# 检查文件是否为ZIP备份文件if file.endswith('.zip') and 'backup' in file:# 检查文件的修改时间if os.path.getmtime(file_path) < cutoff:os.remove(file_path)logger.info(f'删除旧备份文件:{file_path}')except Exception as e:logger.error(f'清理旧备份文件失败:{str(e)}')# 设置定时任务
def setup_scheduled_backup(source_dir, backup_dir, network_share=None, schedule_str='0 0 * * *'):"""设置定时备份任务schedule_str格式:分钟 小时 日 月 星期,如'0 0 * * *'表示每天凌晨执行"""# 先执行一次备份perform_backup(source_dir, backup_dir, network_share)# 设置定时任务try:# 解析cron表达式parts = schedule_str.split()if len(parts) != 5:raise ValueError("Cron表达式格式错误,应为:分钟 小时 日 月 星期")minute, hour, day, month, weekday = parts# 设置定时任务if weekday != '*':# 按星期执行getattr(schedule.every(), 'monday' if weekday == '1' else 'tuesday' if weekday == '2' else 'wednesday' if weekday == '3' else 'thursday' if weekday == '4' else 'friday' if weekday == '5' else 'saturday' if weekday == '6' else 'sunday').at(f'{hour}:{minute}').do(perform_backup, source_dir, backup_dir, network_share)elif day != '*':# 按月中的日期执行schedule.every().day.at(f'{hour}:{minute}').do(lambda: perform_backup(source_dir, backup_dir, network_share))else:# 按小时执行schedule.every(int(hour)).hours.at(f':{minute}').do(lambda: perform_backup(source_dir, backup_dir, network_share))logger.info(f'已设置定时备份任务,表达式:{schedule_str}')logger.info('备份服务已启动,按Ctrl+C停止...')# 运行调度器while True:schedule.run_pending()time.sleep(60) # 每分钟检查一次except Exception as e:logger.error(f'设置定时任务失败:{str(e)}')# 主函数
def main():# 创建解析器parser = argparse.ArgumentParser(description='文件夹定时备份工具')# 调用示例 cd d:\PyStudy\MysqlManagerTool ; python folder_backup.py --source D:\PyStudy\GuShiJieLong --backup D:\PyStudy\自动备份文件夹 --schedule once# 添加命令行参数parser.add_argument('--source', '-s', required=True, help='要备份的源文件夹路径')parser.add_argument('--backup', '-b', default='./backups', help='本地备份文件夹路径,默认为./backups')parser.add_argument('--network', '-n', help='局域网共享文件夹路径(可选)')parser.add_argument('--schedule', '-t', default='0 0 * * *', help='定时任务表达式,默认为每天凌晨执行')parser.add_argument('--log', '-l', default='folder_backup.log', help='日志文件路径')# 解析命令行参数args = parser.parse_args()# 验证源文件夹是否存在if not os.path.exists(args.source):print(f'错误:源文件夹不存在:{args.source}')return# 全局变量:日志记录器global loggerlogger = setup_logger(args.log)logger.info('=== 文件夹定时备份工具启动 ===')logger.info(f'源文件夹:{args.source}')logger.info(f'本地备份文件夹:{args.backup}')logger.info(f'网络共享文件夹:{args.network if args.network else "未设置"}')logger.info(f'定时任务表达式:{args.schedule}')try:# 启动定时备份服务setup_scheduled_backup(args.source, args.backup, args.network, args.schedule)except KeyboardInterrupt:logger.info('用户中断,备份服务已停止')except Exception as e:logger.error(f'程序异常:{str(e)}')logger.info('=== 文件夹定时备份工具已退出 ===')if __name__ == '__main__':main()
💡 代码优化小建议
如果你想自己动手修改或优化这个工具,这里有几个小建议:
-
自定义保留天数:目前清理旧备份的天数是硬编码在
cleanup_old_backups
函数里的,你可以把它改成一个命令行参数,这样就能更灵活地控制了。 -
备份加密:对于特别重要的文件,你可以在
create_zip
函数中添加密码保护功能。 -
邮件通知:如果备份失败,你可以添加一个发送邮件通知的功能,让你及时知道问题。
总结:让数据安全成为习惯
数据备份是保护重要信息的第一道防线,也是最有效的防线。这个文件夹定时备份工具虽然简单,但能帮你建立起自动化的数据保护机制,让你不再为数据丢失而担心。
无论你是学生、上班族还是自由职业者,只要你有重要的文件需要保护,这个工具都能为你提供帮助。赶快试试看吧!
如果你在使用过程中遇到问题,或者有更好的改进建议,欢迎留言讨论。让我们一起让数据备份变得更简单、更可靠!