腾讯云cos python自动上传

import os
import tempfile
import sys
from qcloud_cos import CosConfig, CosS3Client
from qcloud_cos.cos_threadpool import SimpleThreadPool
import psutil
import time


local_folder_path = r'E:\demo'  # 本地文件夹路径
cos_folder_path = '存储桶下面的路径,存储桶名不需要'  # COS 的文件夹路径

total_files = 0
uploaded_byte = 0
uploaded_sum = 0
upload_success = []  # 保存上传成功的文件和文件夹路径

#上传完成回调
def upload_percentage(consumed_bytes, total_bytes):
    global uploaded_byte  # 声明全局变量
    global uploaded_sum    # 声明全局变量

    uploaded_byte += consumed_bytes
    rate = int(100 * (float(uploaded_byte) / float(total_files)))
    if(rate >= 100):
        rate = 99
    if(uploaded_sum != rate):
        print('\r{0}%;'.format(rate))
    uploaded_sum = rate
    printUploadFile(rate)
    get_network_speed()
    sys.stdout.flush()

def printUploadFile(num):
    global upload_success
    l = len(upload_success)
    c = int(l * num / 100)

    for i in range(c):
        if not upload_success[i]['log']:
            print(upload_success[i]['url'])
            upload_success[i]['log'] = True


#遍历所有文件夹
def count_files_recursively(folder_path):
    file_count = 0
    try:
        # 递归遍历文件夹及其子文件夹
        for root, dirs, files in os.walk(folder_path):
            file_count += len(files)  # 累计文件数量
        return file_count
    except Exception as e:
        print("Error:", e)
        return None
    

#上传文件到cos
def upload_directory(local_folder_path, cos_folder_path = ''):
    global total_files  # 声明全局变量
    global upload_success
    secret_id = 'secret_id'
    secret_key = 'secret_key'
    region = 'ap-xxxx'  # 要上传到的 COS 地域
    bucket_name = 'bucket_name'  # COS 存储桶名称
    token = None
    domain = None
    config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Domain=domain)
    client = CosS3Client(config)
    pool = SimpleThreadPool()

    total_files = sum(os.path.getsize(os.path.join(root, file)) for root, dirs, files in os.walk(local_folder_path) for file in files if file != 'desktop.ini')

    for root, dirs, files in os.walk(local_folder_path):
        for file in files:
            # 排除特定文件 desktop.ini
            if file != 'desktop.ini':
                local_file_path = os.path.join(root, file)
                remote_file_path = os.path.join(cos_folder_path, os.path.relpath(local_file_path, local_folder_path))
                remote_file_path = remote_file_path.replace("\\", "/")
                pool.add_task(client.upload_file,Bucket = bucket_name,Key = remote_file_path,LocalFilePath = local_file_path,progress_callback=upload_percentage)
                upload_success.append({'url':local_file_path,'log':False})

    for dir in dirs:
        remote_dir_path = os.path.join(cos_folder_path, os.path.relpath(os.path.join(root, dir), local_folder_path))
        # 创建一个空文件来代表文件夹
        empty_file_path = os.path.join(tempfile.gettempdir(), 'empty_file')
        empty_file_path = empty_file_path.replace("\\", "/")
        with open(empty_file_path, 'wb'):
            pass

        pool.add_task(client.upload_file,Bucket = bucket_name,Key = remote_dir_path + '/',local_file_path = empty_file_path)
        os.remove(empty_file_path)


    pool.wait_completion()
    result = pool.get_result()
    if not result['success_all']:
        print("Not all files upload successed. you should retry")
    else:
        print("100%")
        printUploadFile(100)
    print('All uploaded')


#上传网络检测
def get_network_speed(interval=1):
    net_io = psutil.net_io_counters()
    bytes_sent = net_io.bytes_sent
        # bytes_received = net_io.bytes_recv
        
    time.sleep(interval)
        
    new_net_io = psutil.net_io_counters()
    new_bytes_sent = new_net_io.bytes_sent
    # new_bytes_received = new_net_io.bytes_recv
        
    sent_speed = (new_bytes_sent - bytes_sent) / interval
    mbps = (sent_speed * 8) / 1_000_000
    mbps = "{:.2f}".format(mbps)
    # recv_speed = (new_bytes_received - bytes_received) / interval
    print(f"{mbps} Mbps/s")
    # print(f"Receive Speed: {recv_speed} bytes/s")
    # return mbps
             
if __name__ == "__main__":
    # if len(sys.argv) != 3:
    #     print("用法:python 脚本名.py <本地文件夹路径> <COS 文件夹路径>")
    #     sys.exit(1)

    # local_folder_path = sys.argv[1]
    # cos_folder_path = sys.argv[2]

    # print(local_folder_path)
    # print(cos_folder_path)

    upload_directory(local_folder_path,cos_folder_path)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值