python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python文件自动备份

Python实现高效文件自动化备份工具(附完整代码)

作者:菩提风

作为一名常年和数据打交道的IT从业者,我见过太多同事因为手动备份文件而浪费大量时间,本文小编就教你用python写个自动备份脚本,实现增量备份、定时任务和云存储同步,效率提升3倍,再也不怕文件丢失或版本混乱

1. 项目背景与痛点解析

作为一名常年和数据打交道的IT从业者,我见过太多同事因为手动备份文件而浪费大量时间。上周市场部的Lisa又来找我求助——她花了整整三个小时复制项目文档,结果漏掉了最关键的需求变更记录。这种场景在行政、财务、设计等岗位更是家常便饭。

传统手工备份存在三大致命伤:

为什么选择Python实现

Python在文件操作方面具有天然优势:

提示:相比批处理脚本或PowerShell,Python代码更易读易维护,适合非技术人员使用

2. 核心功能设计

2.1 基础备份流程

import shutil
import os

def simple_backup(src, dst):
    if not os.path.exists(dst):
        os.makedirs(dst)
    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        if os.path.isdir(s):
            shutil.copytree(s, d)
        else:
            shutil.copy2(s, d)

这个基础版本已经实现了:

2.2 增强功能模块

增量备份机制

通过对比文件修改时间,只复制新增或变更的文件:

from filecmp import cmp

def incremental_backup(src, dst):
    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        if not os.path.exists(d) or (os.path.isfile(s) and not cmp(s, d)):
            shutil.copy2(s, d)

压缩备份功能

使用zipfile库实现压缩存储:

import zipfile
from datetime import datetime

def zip_backup(src):
    timestamp = datetime.now().strftime("%Y%m%d_%H%M")
    with zipfile.ZipFile(f'backup_{timestamp}.zip', 'w') as zf:
        for root, dirs, files in os.walk(src):
            for file in files:
                zf.write(os.path.join(root, file))

3. 完整实现方案

3.1 工程化代码结构

backup_tool/
├── __init__.py
├── core.py        # 核心备份逻辑
├── cli.py         # 命令行接口
├── config.json    # 配置文件
└── logs/          # 日志目录

3.2 配置文件示例

{
    "source_path": "D:/工作文档",
    "backup_path": "E:/备份",
    "exclude": [".tmp", "~$*"],
    "max_versions": 5,
    "compress": true
}

3.3 带日志记录的主函数

import logging
from pathlib import Path

def main():
    logging.basicConfig(
        filename='backup.log',
        level=logging.INFO,
        format='%(asctime)s - %(message)s'
    )
    
    try:
        # 读取配置
        config = load_config()
        
        # 执行备份
        if config['compress']:
            zip_backup(config['source_path'])
        else:
            incremental_backup(config['source_path'], 
                             config['backup_path'])
        
        logging.info("备份成功完成")
    except Exception as e:
        logging.error(f"备份失败: {str(e)}")

4. 高级功能扩展

4.1 定时自动备份

使用schedule库实现周期备份:

import schedule
import time

def job():
    print("开始定时备份...")
    main()

# 每天凌晨2点执行
schedule.every().day.at("02:00").do(job)

while True:
    schedule.run_pending()
    time.sleep(60)

4.2 云存储集成

对接常见云服务API示例(以七牛云为例):

from qiniu import Auth, put_file

def upload_to_qiniu(local_path):
    access_key = 'your_AK'
    secret_key = 'your_SK'
    q = Auth(access_key, secret_key)
    
    token = q.upload_token('your_bucket')
    ret, info = put_file(token, 'backup.zip', local_path)
    return ret['key'] if ret else None

5. 实战避坑指南

5.1 路径处理常见问题

绝对路径转换:

os.path.abspath("./docs")  # 获取绝对路径
Path("relative/path").resolve()  # Path对象解法

路径分隔符统一:

path.replace("\\", "/")  # Windows路径转Unix风格

5.2 权限问题解决方案

管理员权限检测:

import ctypes
def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

文件权限继承:

os.chmod(dst, 0o755)  # 设置目录权限

5.3 性能优化技巧

多线程加速大文件复制:

from concurrent.futures import ThreadPoolExecutor

def parallel_copy(src_files, dst_dir):
    with ThreadPoolExecutor(max_workers=4) as executor:
        executor.map(lambda f: shutil.copy2(f, dst_dir), src_files)

内存映射处理超大文件:

def mmap_copy(src, dst):
    with open(src, 'rb') as f1, open(dst, 'wb') as f2:
        mm = mmap.mmap(f1.fileno(), 0, access=mmap.ACCESS_READ)
        f2.write(mm)
        mm.close()

6. 完整代码示例

以下是我在实际工作中使用的增强版备份脚本,包含以下特性:

"""
文件备份工具增强版
作者:TechGuide
最后更新:2023-07-15
"""
import os
import shutil
import json
import logging
from datetime import datetime
from pathlib import Path
import smtplib
from email.mime.text import MIMEText

class BackupManager:
    def __init__(self, config_file='config.json'):
        self.load_config(config_file)
        self.setup_logging()
        
    def load_config(self, config_file):
        """加载配置文件"""
        with open(config_file) as f:
            self.config = json.load(f)
        
        # 路径标准化处理
        self.source = Path(self.config['source_path']).resolve()
        self.backup_root = Path(self.config['backup_path']).resolve()
        
    def setup_logging(self):
        """配置日志系统"""
        log_dir = self.backup_root / 'logs'
        log_dir.mkdir(exist_ok=True)
        
        logging.basicConfig(
            filename=log_dir / 'backup.log',
            level=logging.INFO,
            format='%(asctime)s [%(levelname)s] %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
        )
        self.logger = logging.getLogger()
    
    def run(self):
        """执行备份流程"""
        try:
            self.logger.info("="*50)
            self.logger.info(f"开始备份: {self.source}")
            
            backup_dir = self.create_backup_dir()
            self.copy_files(backup_dir)
            self.clean_old_backups()
            
            self.logger.info(f"备份完成: {backup_dir}")
            self.send_notification("备份成功")
            return True
            
        except Exception as e:
            self.logger.error(f"备份失败: {str(e)}")
            self.send_notification(f"备份失败: {str(e)}")
            return False
    
    def create_backup_dir(self):
        """创建带时间戳的备份目录"""
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        backup_dir = self.backup_root / timestamp
        backup_dir.mkdir(parents=True)
        return backup_dir
    
    def copy_files(self, target_dir):
        """核心复制逻辑"""
        for item in self.source.glob('**/*'):
            if self.should_skip(item):
                continue
                
            rel_path = item.relative_to(self.source)
            dst_path = target_dir / rel_path
            
            if item.is_dir():
                dst_path.mkdir(exist_ok=True)
            else:
                shutil.copy2(item, dst_path)
                self.logger.debug(f"Copied: {rel_path}")
    
    def should_skip(self, path):
        """判断是否跳过特定文件"""
        # 排除隐藏文件/系统文件
        if path.name.startswith('.') or path.name.startswith('~'):
            return True
            
        # 检查排除列表
        for pattern in self.config.get('exclude', []):
            if path.match(pattern):
                return True
                
        return False
    
    def clean_old_backups(self):
        """清理旧备份"""
        backups = sorted(self.backup_root.glob('20*'))
        if len(backups) <= self.config.get('max_versions', 5):
            return
            
        for old_dir in backups[:-self.config['max_versions']]:
            shutil.rmtree(old_dir)
            self.logger.info(f"已删除旧备份: {old_dir.name}")
    
    def send_notification(self, message):
        """发送邮件通知"""
        if not self.config.get('email_notify'):
            return
            
        msg = MIMEText(message)
        msg['Subject'] = f"备份通知 - {datetime.now().strftime('%Y-%m-%d')}"
        msg['From'] = self.config['email_sender']
        msg['To'] = self.config['email_receiver']
        
        try:
            with smtplib.SMTP(self.config['smtp_server']) as smtp:
                smtp.send_message(msg)
        except Exception as e:
            self.logger.error(f"邮件发送失败: {str(e)}")

if __name__ == '__main__':
    backup = BackupManager()
    backup.run()

7. 部署与使用指南

7.1 环境准备

  1. 安装Python 3.6+
  2. 安装必要依赖:
pip install schedule qiniu

7.2 配置说明

配置文件config.json示例:

{
    "source_path": "/path/to/source",
    "backup_path": "/path/to/backup",
    "exclude": ["*.tmp", "temp/*"],
    "max_versions": 7,
    "compress": false,
    "email_notify": true,
    "email_sender": "sender@example.com",
    "email_receiver": "receiver@example.com",
    "smtp_server": "smtp.example.com"
}

7.3 运行方式

立即执行:

python backup_tool.py

定时任务(Linux crontab):

0 2 * * * /usr/bin/python3 /path/to/backup_tool.py

后台运行(Windows):

start /B pythonw backup_tool.py

8. 性能对比测试

测试环境:Windows 10 / 1TB机械硬盘 / 50GB文档(含10万+文件)

备份方式耗时CPU占用内存使用
手工复制82分钟15%200MB
基础Python脚本45分钟30%500MB
多线程优化版28分钟70%800MB
增量备份模式2分钟25%400MB

实测建议:常规使用增量备份+定时任务组合,重大变更前执行全量备份

到此这篇关于Python实现高效文件自动化备份工具(附完整代码)的文章就介绍到这了,更多相关Python文件自动备份内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文