首页 > 编程语言 >python 递归上传文件到阿里云oss

python 递归上传文件到阿里云oss

时间:2023-11-10 10:23:53浏览次数:42  
标签:递归 python 上传 oss state file path local

python 递归上传文件到阿里云oss

import os
import oss2
import json
# 阿里云 OSS 访问信息
access_key_id = 'xxxxxxxxx'
access_key_secret = 'xxxxxxxxxxxxx'
endpoint = 'xxxxxxxxxxxxx'  
bucket_name = 'bucketName'

# 本地目录路径
local_directory = '/home/test'

# 记录上次上传的状态,可以使用本地文件、数据库或其他方式进行记录
# 这里使用一个简单的本地文件来记录状态
state_file = 'upload_state.txt'

# 创建 OSS 客户端
auth = oss2.Auth(access_key_id, access_key_secret)
bucket = oss2.Bucket(auth, endpoint, bucket_name)


# 获取上次上传的状态,如果没有则初始化为空字典
# upload_state = {}
if os.path.exists(state_file):
    sz = os.path.getsize(state_file)
    if not sz:
        upload_state = {}
    else:
        with open(state_file, 'r') as f:
            upload_state = json.load(f)
else:
    upload_state = {}


# 递归上传本地目录及其子目录下的文件
# local_directory  本地目录
# bucket oss bucket名称
# oss_directory  oss 下的目录路径,注意,多级目录时前后不需要加‘/’
def upload_directory_to_oss(local_directory, bucket, oss_directory='logs'):
    for root, dirs, files in os.walk(local_directory):
        for file in files:
            local_file_path = os.path.join(root, file)
            oss_object_key = os.path.join(oss_directory, os.path.relpath(local_file_path, local_directory))

            # 检查文件是否需要上传
            if should_upload(local_file_path, oss_object_key):
                # 上传文件到 OSS
                bucket.put_object_from_file(oss_object_key, local_file_path)
                print(f'Uploaded {local_file_path} to {oss_object_key}')

                # 记录上传状态
                upload_state[oss_object_key] = os.path.getmtime(local_file_path)

                # 成功上传后,删除本地源文件
                os.remove(local_file_path)
                print(f'Deleted {local_file_path}')


# 判断文件是否需要上传
def should_upload(local_file_path, oss_object_key):
    if oss_object_key not in upload_state:
        # 文件未上传过,需要上传
        return True
    else:
        # 文件已上传过,检查本地文件的修改时间是否大于上传时间
        local_mtime = os.path.getmtime(local_file_path)
        return local_mtime > upload_state[oss_object_key]


# 开始上传
upload_directory_to_oss(local_directory, bucket)

# 保存上传状态到本地文件
with open(state_file, 'w') as f:
    json.dump(upload_state, f)

标签:递归,python,上传,oss,state,file,path,local
From: https://www.cnblogs.com/pgyLang/p/17823487.html

相关文章

  • 【Mquant】9:python批量铭刻erc-20铭文
    1.ETHS铭文ETHS铭文是以太坊铭文协议Ethscriptions的代币名称。Ethscriptions是一个基于以太坊的铭文协议,允许用户在以太坊主网上刻入不同类型的文件,并将其记录到区块中。ETHS作为Ethscriptions的第一个"概念币",引起了人们的关注和热议。以太坊铭文协议Ethscriptions的特点包......
  • 《流畅的Python》 读书笔记 第7章_函数装饰器和闭包
    第7章函数装饰器和闭包装饰器这个名称可能更适合在编译器领域使用,因为它会遍历并注解句法树函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为。这是一项强大的功能,但是若想掌握,必须理解闭包如果你想自己实现函数装饰器,那就必须了解闭包的方方面面,因此也就需......
  • Python - !r
    没有使用!r:classPoint:def__init__(self,x,y):self.x=xself.y=ydef__repr__(self):returnf'Point({self.x},{self.y})'p=Point('1','2')print(repr(p))#输出:Point(1,2)p=Point(......
  • appium+python设置app绝对路径和设置appPackage
     设置了“app”以后,就无需再设置appPackage、appActivityPATH=lambdap:os.path.abspath(os.path.join(os.path.dirname(__file__),p))desired_caps['app']=PATH(app_path)#desired_caps['appPackage']=get_app_package_name()#desired_caps['......
  • Python抽象类介绍
    抽象类什么是抽象类与java一样,python也有抽象类的概念。抽象类是一种特殊的类,它只能有抽象方法,不能被实例化,在子类继承抽象类时,不能通过实例化使用其抽象方法,必须实现该方法。抽象类的作用抽象类可以实现多个子类中共用的部分,而不需要重复写到实现类中。从设计角度去看,抽象类......
  • python用支持向量机回归(SVR)模型分析用电量预测电力消费|附代码数据
    全文链接:http://tecdat.cn/?p=23921最近我们被客户要求撰写关于支持向量机回归的研究报告,包括一些图形和统计输出。本文描述了训练支持向量回归模型的过程,该模型用于预测基于几个天气变量、一天中的某个小时、以及这一天是周末/假日/在家工作日还是普通工作日的用电量关于支持......
  • MySQL 数据库表格创建、数据插入及获取插入的 ID:Python 教程
    创建表格要在MySQL中创建表格,请使用"CREATETABLE"语句。确保在创建连接时定义了数据库的名称。示例创建一个名为"customers"的表格:importmysql.connectormydb=mysql.connector.connect(host="localhost",user="yourusername",password="yourpassword&qu......
  • python升级到3.12版本, 开发模式安装包, 在vscode下Pylance无法解析的问题处理
    问题描述在python3.11版本下开发python库,为方便调测,使用开发模式安装包.使用如下命令:pipinstall-e.其中-e参数表示开发模式下安装python包,它并没有把包相关文件拷贝到site-packages目录,而是创建一个链接指向当前的开发库.这样,当自己开发的包修改后会立即生效,......
  • MySQL 数据库表格创建、数据插入及获取插入的 ID:Python 教程
    创建表格要在MySQL中创建表格,请使用"CREATETABLE"语句。确保在创建连接时定义了数据库的名称。示例创建一个名为"customers"的表格:importmysql.connectormydb=mysql.connector.connect(host="localhost",user="yourusername",password="yourpassword&qu......
  • 递归获取指定目录下的指定类型的文件
     1:递归获取指定目录下的指定类型的文件     public class FileTool    {        /// <summary>        ///  私有变量        ///  </summary>        private static List<FileInfo> lst = new List<FileInfo......