用华为云 OBS Python SDK,写一个本地文件夹自动备份小工具
【摘要】 本地文件怕误删、怕硬盘坏?本文用华为云 OBS 官方 Python SDK(esdk-obs-python)写一个可复用的文件夹自动备份/恢复小工具,纯代码驱动、无需控制台操作,并给出定时任务的接法。
一、为什么写这个工具
对象存储 OBS 的数据持久性标称 12 个 9,标准存储 ¥0.099/GB/月,拿来存备份性价比很高。但我不太想每次都登录控制台手动传文件——那就写个脚本,一条命令把本地文件夹整体传上去,还能列清单、下载恢复、删旧版本。
这个工具能干什么:
- 备份:把本地某个文件夹整体传到 OBS,保留相对路径;
- 列举:看看桶里都备份了哪些文件、多大、什么时候;
- 恢复:从云端把某个文件下载回本地;
- 清理:删掉不再需要的旧备份。

二、环境准备
安装官方 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 / macOS:
crontab -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)