当前位置: 首页 > news >正文

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,都能正常使用

为什么要用这个工具?

可能有人会说:"我手动复制粘贴不也行吗?"确实可以,但这个工具的优势在于:

  1. 不会忘:设定好时间后,系统会自动执行,再也不会因为工作忙忘记备份
  2. 更安全:不仅本地有备份,还能同步到局域网其他电脑,双重保障
  3. 更高效:一键设置,一劳永逸,节省你的宝贵时间
  4. 更整洁:自动清理旧备份,保持存储空间整洁有序

核心功能详解

📁 递归压缩,一个都不漏

这个工具会把你指定的文件夹里的所有内容,包括子文件夹、孙子文件夹里的所有文件,都压缩成一个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

这个函数是备份的核心部分,它会:

  1. 创建一个ZIP压缩文件
  2. 遍历你指定的文件夹里的所有文件和子文件夹
  3. 把每个文件都添加到ZIP文件中
  4. 使用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库来管理定时任务:

  1. 首先会立即执行一次备份
  2. 然后根据你提供的cron表达式设置定时任务
  3. 最后进入一个无限循环,每分钟检查一次是否到了执行时间

这里的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)}')

这个函数会帮你自动清理过期的备份文件:

  1. 计算出一个时间点(当前时间减去要保留的天数)
  2. 遍历备份文件夹里的所有文件
  3. 检查每个ZIP备份文件的修改时间
  4. 如果文件太旧(早于计算出的时间点),就删除它

注意这里的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)

主函数是整个工具的入口,它负责:

  1. 解析你在命令行中输入的参数(如源文件夹、备份路径等)
  2. 验证源文件夹是否存在
  3. 设置日志系统
  4. 启动定时备份服务

通过这个简单的结构,整个工具就能有条不紊地工作了!

完整代码:

#!/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()

💡 代码优化小建议

如果你想自己动手修改或优化这个工具,这里有几个小建议:

  1. 自定义保留天数:目前清理旧备份的天数是硬编码在cleanup_old_backups函数里的,你可以把它改成一个命令行参数,这样就能更灵活地控制了。

  2. 备份加密:对于特别重要的文件,你可以在create_zip函数中添加密码保护功能。

  3. 邮件通知:如果备份失败,你可以添加一个发送邮件通知的功能,让你及时知道问题。

总结:让数据安全成为习惯

数据备份是保护重要信息的第一道防线,也是最有效的防线。这个文件夹定时备份工具虽然简单,但能帮你建立起自动化的数据保护机制,让你不再为数据丢失而担心。

无论你是学生、上班族还是自由职业者,只要你有重要的文件需要保护,这个工具都能为你提供帮助。赶快试试看吧!

如果你在使用过程中遇到问题,或者有更好的改进建议,欢迎留言讨论。让我们一起让数据备份变得更简单、更可靠!


文章转载自:

http://r8OmpRsc.wqwbj.cn
http://h5B0mlWy.wqwbj.cn
http://FWDFphOX.wqwbj.cn
http://7jdpjbxF.wqwbj.cn
http://bnsir6m9.wqwbj.cn
http://4qTjzBqn.wqwbj.cn
http://eEu17LtA.wqwbj.cn
http://GkGcItyZ.wqwbj.cn
http://aqTyZcNt.wqwbj.cn
http://wAJLGuNv.wqwbj.cn
http://QeetpXDn.wqwbj.cn
http://1b7cNCXq.wqwbj.cn
http://uCFiQe3Y.wqwbj.cn
http://8rBtCEWO.wqwbj.cn
http://yhFEXx5W.wqwbj.cn
http://3vF1Sy5p.wqwbj.cn
http://bt5sQlZK.wqwbj.cn
http://WJND3NuA.wqwbj.cn
http://7hQfrszS.wqwbj.cn
http://16FEigEO.wqwbj.cn
http://hagCYdwo.wqwbj.cn
http://TWpaXDNa.wqwbj.cn
http://IwGM3EmX.wqwbj.cn
http://h4hzNX5e.wqwbj.cn
http://0PzUBLRO.wqwbj.cn
http://6qPrcPPu.wqwbj.cn
http://aawjRvzV.wqwbj.cn
http://eOaQuT2k.wqwbj.cn
http://zEf1xCDK.wqwbj.cn
http://ZVTQ0LaG.wqwbj.cn
http://www.dtcms.com/a/384144.html

相关文章:

  • 量子能量泵:一种基于并联电池与电容阵的动态直接升压架构
  • 从 WPF 到 Avalonia 的迁移系列实战篇7:EventTrigger 的迁移
  • pgNow:一款免费的PostgreSQL监控与性能诊断工具
  • 【完整源码+数据集+部署教程】俯视视角交通场景图像分割系统: yolov8-seg-FocalModulation
  • 《用 Python 构建可靠的自动化 Web 测试:从入门到进阶实战(含 Playwright + pytest + CI/Docker)》
  • Nginx负载均衡集群实验步骤
  • 从go语言出发,搭建多语言云原生场景下全链路观测体系
  • 9.13 9.15 JavaWeb(事务管理、AOP P172-P182)
  • 九、vue3后台项目系列——tag标签逻辑
  • 数据结构入门指南:计算机专业核心课精要
  • 贪心算法应用:DNS缓存问题详解
  • Python爬虫实战——使用NetNut网页解锁器获取亚马逊电商数据
  • 知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
  • NGUI--游戏登录、注册和服务器选择系统​​
  • C++ std::vector
  • 知微集:Transformer
  • 大数据毕业设计选题推荐-基于大数据的客户购物订单数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
  • C# JPG转PDF实现方案
  • 单变量单步时序预测 | TCN-BiLSTM时间卷积结合长短期记忆神经网络(MATLAB)
  • uniapp scroll-view 设置scrollTop无效
  • Day24_【深度学习(2)—PyTorch框架安装】
  • 未来汽车电气/电子(E/E)架构——迈向全新电气/电子范式之路上的复杂性掌控
  • 【Linux手册】mmap 接口:内存映射实现高效 IO 的
  • 如何使用代理 IP 实现爬虫代理
  • Ubuntu 录制 gif
  • Day24_【深度学习(3)—PyTorch使用—张量的创建和类型转换】
  • IP-Prefix 配置核心要点与典型应用场景
  • 为什么企业需要高防IP
  • 通过 DNS 解析SCAN IP
  • 网络:TCP/IP协议