用华为云 OBS Python SDK,写一个本地文件夹自动备份小工具

举报
海是岛思念的泪 发表于 2026/08/16 19:21:06 2026/08/16
【摘要】 本地文件怕误删、怕硬盘坏?本文用华为云 OBS 官方 Python SDK(esdk-obs-python)写一个可复用的文件夹自动备份/恢复小工具,纯代码驱动、无需控制台操作,并给出定时任务的接法。

一、为什么写这个工具

对象存储 OBS 的数据持久性标称 12 个 9,标准存储 ¥0.099/GB/月,拿来存备份性价比很高。但我不太想每次都登录控制台手动传文件——那就写个脚本,一条命令把本地文件夹整体传上去,还能列清单、下载恢复、删旧版本。

这个工具能干什么:

  • 备份:把本地某个文件夹整体传到 OBS,保留相对路径;
  • 列举:看看桶里都备份了哪些文件、多大、什么时候;
  • 恢复:从云端把某个文件下载回本地;
  • 清理:删掉不再需要的旧备份。

image.png

二、环境准备

安装官方 SDK:

pip install esdk-obs-python

AK/SK 建议走环境变量,不要硬编码进脚本(避免泄露):

export AccessKeyID="你的AK"
export SecretAccessKey="你的SK"

区域 Endpoint 对照(节选):

区域 Endpoint
华北-北京四 obs.cn-north-4.myhuaweicloud.com
华南-广州 obs.cn-south-1.myhuaweicloud.com
华东-上海一 obs.cn-east-3.myhuaweicloud.com
中国-香港 obs.ap-southeast-1.myhuaweicloud.com

先准备一个桶(任意方式创建均可,备份场景建议设为私有,不需要公共读)。

三、核心代码

完整脚本如下,保存为 backup.py(同目录已附 02-backup.py 可直接用):

import os
import traceback
from obs import ObsClient, GetObjectRequest

# AK/SK 从环境变量读取,避免硬编码泄露
AK = os.getenv("AccessKeyID")
SK = os.getenv("SecretAccessKey")

# 按区域填写 Endpoint,示例为华北-北京四
SERVER = "https://obs.cn-north-4.myhuaweicloud.com"
BUCKET = "my-backup-bucket"   # 替换成你自己的桶名


def get_client():
    return ObsClient(access_key_id=AK, secret_access_key=SK, server=SERVER)


def backup_folder(local_dir, prefix="backup/"):
    """把本地文件夹整体备份到 OBS,保留相对路径作为对象名。"""
    client = get_client()
    local_dir = os.path.abspath(local_dir)
    uploaded, failed = 0, 0
    for root, _, files in os.walk(local_dir):
        for name in files:
            local_path = os.path.join(root, name)
            rel = os.path.relpath(local_path, local_dir).replace(os.sep, "/")
            object_key = prefix + rel
            try:
                resp = client.putFile(BUCKET, object_key, local_path)
                if resp.status < 300:
                    uploaded += 1
                    print(f"✓ {rel}")
                else:
                    failed += 1
                    print(f"✗ {rel}  error={resp.errorCode}")
            except Exception:
                failed += 1
                print(f"✗ {rel}  exception")
                traceback.print_exc()
    print(f"\n完成:成功 {uploaded} 个,失败 {failed} 个")
    client.close()


def list_backups(prefix="backup/"):
    """列出已备份的对象(单次最多 1000 条,更多需翻页)。"""
    client = get_client()
    resp = client.listObjects(BUCKET, prefix=prefix, maxKeys=1000)
    if resp.status < 300:
        for obj in resp.body.contents:
            print(f"{obj.key}\t{obj.size}\t{obj.lastModified}")
    else:
        print(f"列出失败:{resp.errorCode} {resp.errorMessage}")
    client.close()


def restore_file(object_key, local_path):
    """从 OBS 下载单个对象到本地。"""
    client = get_client()
    os.makedirs(os.path.dirname(local_path) or ".", exist_ok=True)
    req = GetObjectRequest()
    req.downloadPath = local_path
    resp = client.getObject(BUCKET, object_key, getObjectRequest=req)
    if resp.status < 300:
        print(f"已恢复:{object_key} -> {local_path}")
    else:
        print(f"恢复失败:{resp.errorCode} {resp.errorMessage}")
    client.close()


def delete_backup(object_key):
    """删除某个备份对象。"""
    client = get_client()
    resp = client.deleteObject(BUCKET, object_key)
    if resp.status < 300:
        print(f"已删除:{object_key}")
    else:
        print(f"删除失败:{resp.errorCode} {resp.errorMessage}")
    client.close()


if __name__ == "__main__":
    # 示例:备份当前目录下的 docs 文件夹
    backup_folder("./docs", prefix="backup/docs/")
    # list_backups()                       # 列出备份
    # restore_file("backup/docs/notes.txt", "./restore/notes.txt")  # 恢复
    # delete_backup("backup/docs/old.txt") # 删除

代码几个关键点:

  • ObsClient 以 AK/SK + Endpoint 初始化;putFile/getObject/listObjects/deleteObject 是四个核心方法,返回结果里用 resp.status < 300 判断成功;
  • 备份时用 os.walk 遍历文件夹,object_key 用「前缀 + 相对路径」拼出来,恢复时就能原样还原目录结构;
  • 下载通过 GetObjectRequest().downloadPath 指定落盘路径,避免把大文件整块读进内存;
  • 末尾用 client.close() 释放连接,脚本里多次操作就每次新建 client。

四、进阶:定时自动备份

脚本写好之后,可以让它每天自动跑,彻底不用手动:

  • Linux / macOScrontab -e 加一行,每天凌晨 2 点执行

    0 2 * * * /usr/bin/python3 /path/to/backup.py >> /var/log/obs_backup.log 2>&1
    
  • Windows:用「任务计划程序」建一个每日 2:00 触发的任务,操作选"启动程序",程序填 python,参数填 backup.py 的完整路径。

  • 再配合 OBS 的生命周期规则,让旧备份自动转低频访问存储或归档,进一步压低成本。

五、成本与小贴士

  • 标准存储 ¥0.099/GB/月,低频访问 ¥0.08/GB/月;备份数据量大可走生命周期自动降冷。
  • 单个超过 100MB 的大文件,建议用 uploadFile 断点续传,比 putFile 更稳。
  • AK/SK 一定走环境变量或临时安全令牌,别写死在脚本里提交到仓库。
  • 备份桶一般设私有即可,不需要公共读;只有像上一篇那种要公网访问的静态站点才需要公共读。

六、小结

用 OBS 官方 Python SDK 写一个备份小工具,几十行代码就覆盖了"备份 / 列举 / 恢复 / 清理",再挂个定时任务就能实现"设一次、忘掉它"的自动备份。比起手动传控制台,脚本化不仅省事,后续接入多文件夹、多桶、 lifecycle 降冷也都只是加几行的事。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。