使用Python将OSS文件免费下载到本地:第二步 将OSS文件下载到ECS中

2023-12-20 14:41:33

在这里插入图片描述

大家好,我是水滴~~

本文将介绍了使用的知识点、以及将OSS文件下载到ECS中的代码、并对该代码进行详细解析、最后给出部署方案,希望能对你有所帮助!

《Python入门核心技术》专栏总目录?点这里


在上一篇文章中,我们将需要下载的OSS文件,全部列举并存入MySQL数据库中。这篇文章是我们继续讲解第二步:将OSS文件下载到ECS中,并修改文件记录的状态。

1. 本文知识点

1.1 datetime 模块

datetime模块是Python标准库中用于处理日期和时间的模块。它提供了多个类来处理日期、时间、时间间隔等,并且支持日期时间的运算和格式化。

更多介绍参见:《日期和时间(time、datetime、calendar 模块

1.2 os 模块

os 是 Python 标准库中的一个模块,提供了与操作系统交互的功能。通过 os 模块,您可以执行各种与文件系统、进程管理、环境变量等相关的操作。

更多介绍参见:《os 模块

1.3 MySQL 连接器

mysql-connector-python 是 MySQL 官方提供的 Python 连接器,用于在 Python 应用程序中与 MySQL 数据库进行交互。它是一个纯 Python 实现的驱动程序,可以通过它执行 SQL 查询、插入、更新、删除等操作。

在使用前需要先安装该库,下面是安装命令:

pip install mysql-connector-python

1.4 PyInstaller

PyInstaller 是一个用于将 Python 应用程序打包成独立可执行文件的工具。它可以将 Python 代码及其依赖项(包括解释器)打包成单个可执行文件,这样用户可以在没有安装 Python 解释器或依赖项的情况下运行你的应用程序。你可以使用 PyInstaller 来创建跨平台的可执行文件,支持 Windows、macOS 和 Linux 等操作系统。

在使用前需要先安装该库,下面是安装命令:

pip install pyinstaller

2. 代码与解析

2.1 安装依赖

下面代码使用了 oss2mysql-connector-python 两个第三方库,所以要提前安装它们,下面是安装指令:

pip install oss2
pip install mysql-connector-python

2.2 完整代码

在项目中创建一个第二步:将OSS文件下载到ECS中.py Python文件,下面是完整代码:

import os
import time
from datetime import datetime

import mysql.connector
import oss2


# 创建并获取 OSS 存储桶对象
def get_bucket():
    # OSS认证,需要 access_key_id 和 access_key_secret
    auth = oss2.Auth('填写你的access_key_id', '填写你的access_key_secret')
    # OSS 端点地址(如果该程序部署到 ECS 上,这里使用内网地址可以节约一些流量)
    endpoint = '填写你的端点,例如:https://oss-cn-qingdao.aliyuncs.com'
    # 存储桶名称
    bucket_name = '填写你的bucket_name'
    # 创建一个存储桶对象
    return oss2.Bucket(auth, endpoint, bucket_name)


# 检测磁盘空间是否充裕
def check_disk_space():
    # 获取当前目录的路径
    current_directory = os.getcwd()
    # 获取当前目录的磁盘空间信息
    disk_usage = os.statvfs(current_directory)
    # 计算当前目录的可用空间
    available_space = disk_usage.f_frsize * disk_usage.f_bavail
    # 将空间大小转换为GB
    available_space_gb = available_space / (1024 ** 3)
    print("当前目录的可用空间:" + str(available_space_gb) + "GB")
    if available_space_gb > 50:
        return True
    else:
        return False


# 创建文件的目录
def makedirs(filename):
    # 获取文件的目录
    directory = os.path.dirname(filename)
    # 检查目录是否存在,如果不存在则创建目录
    if not os.path.exists(directory):
        os.makedirs(directory)


# 文件ECS存储路径
file_path = "/data/app/oss_download/file_list/"

if __name__ == '__main__':
    # 建立与数据库的连接
    cnx = mysql.connector.connect(user='root', password='root', host='localhost', database='oss', port=3306)
    # 创建一个游标对象
    cursor = cnx.cursor()

    # 获取 OSS 存储桶对象
    bucket = get_bucket()

    try:
        while True:
            try:
                # 查询前10个待处理数据,执行查询
                cursor.execute('select id, key from oss_file where status = 0 order by last_modified limit 10')
                # 获取查询结果,结果为元组类型
                results = cursor.fetchall()
                # 查询结果为空,退出循环
                if len(results) == 0:
                    print("-------全部处理完了")
                    break
                # 遍历查询结果,逐个下载
                for row in results:
                    # 打印该文件
                    data = {
                        'id': row[0],
                        'key': row[1]
                    }
                    key = data['key']
                    print(key)
                    # 创建目录
                    file_name = file_path + key
                    makedirs(file_name)

                    # 下载到本地
                    bucket.get_object_to_file(key, file_name)
                    # 修改数据状态,status设为1
                    data['update_time'] = datetime.now()
                    cursor.execute('update oss_file set status = 1, update_time = %(update_time)s where id = %(id)s',
                                   data)
                    # 提交更改到数据库
                    cnx.commit()

                    # 删除OSS文件
                    bucket.delete_object(key)
                    # 修改数据状态,status设为2
                    data['update_time'] = datetime.now()
                    cursor.execute('update oss_file set status = 2, update_time = %(update_time)s where id = %(id)s',
                                   data)
                    # 提交更改到数据库
                    cnx.commit()
                # 下载一轮后,检测一下磁盘空间
                while True:
                    if check_disk_space():
                        break
                    else:
                        # 休眠10分钟
                        time.sleep(600)
            except Exception as e:
                print(str(e))
                # 休眠1秒
                time.sleep(1)
                continue
    finally:
        # 关闭游标和数据库连接
        cursor.close()
        cnx.close()

2.3 代码解析

  • get_bucket方法用于创建并获取OSS的存储桶对象,我这里使用简单的Auth凭证,官方推荐使用安全的ProviderAuth凭证,参见:Python配置访问凭证

  • check_disk_space方法用于检测磁盘剩余空间是否充裕,该方法会输出磁盘大小。为了学习多样性,这里检测磁盘的方式是Linux版本,后面下载到本地改用Windows版本,你可以根据实际情况来选择。

  • makedirs 方法用于检测ECS上是否存在所需目录,如果不存在,则创建目录。

  • main主方法中,首先创建了一个 MySQL 的连接,用于将列举出的文件名写入库中;接着获取OSS的存储桶对象。

  • 接着创建一个死循环,用于不断的下载文件,直到下载完为止。

  • 循环中,首先从数据库中查询前10个待处理的文件列表(status为0,并按last_modified 排序),表示先处理最旧的数据(如果返回的列表为空,表示所有文件已经处理完,退出即可)。

  • 遍历这个文件列表,逐个从OSS中下载到ECS中,使用bucket.get_object_to_file()方法下载,参见:Python下载到本地文件。下载完后,将该记录的状态改为1。

  • 然后再将该文件从OSS中删除,使用bucket.delete_object()方法删除,参见:Python删除文件。删除后,将该记录的状态改为2。

  • 这样处理一轮文件后,检测一下磁盘空间是否充裕,如果充裕就继续处理下一轮,如果不充裕,则休眠10分钟,直到充裕后再执行下一轮。

  • 最后,关闭数据库连接。

3. 部署

3.1 列出依赖项

requirements.txt是一个常用的文本文件,用于列出项目所需的所有依赖项及其版本信息。它通常用于 Python 项目,但也可以在其他项目中使用。

在项目中执行下面命令,可以列出依赖项:

pip freeze > requirements.txt

这将输出当前环境中所有安装的包及其版本信息,并将其写入requirements.txt文件中。

3.2 安装依赖项

在 Linux 服务器的项目根目录下,可以运行以下命令来安装requirements.txt中列出的所有依赖项:

pip install -r requirements.txt

这将安装所列出的所有依赖项及其指定的版本。

3.3 运行 Python 文件

第二步:将OSS文件下载到ECS中.py Python文件拷贝到 Linux 服务器项目根目录下,执行下面命令即可运行该 Python 文件:

python 第二步:将OSS文件下载到ECS中.py

如果想要后台运行,并且将print输出到指定的日志文件中,可以使用以下命令:

nohup python 第二步:将OSS文件下载到ECS中.py > output.log 2>&1 &

这个命令执行以下操作:

  • nohup命令用于在后台运行进程,即使终端关闭后也能继续运行。

  • 第二步:将OSS文件下载到ECS中.py是你要运行的Python脚本。

  • > output.log将标准输出重定向到名为output.log的日志文件中。

  • 2>&1将标准错误也重定向到标准输出,这样错误信息也会被写入到output.log中。

  • 最后的&符号用于将进程放到后台运行。

这样,你的Python项目就会在后台运行,并将print输出写入到指定的日志文件中。

3.4 其他部署方式

如果你想部署在Windows服务器下,一个简单的方式就是通过 PyInstaller 来打包部署。它可以将Python代码及其依赖项(包括解释器)打包成单个可执行文件,这样即使服务器没有安装Python环境也可以运行你的应用程序。

下面命令可以将上面的Python脚本打包成一个exe的可执行文件:

pyinstaller -F 第二步:将OSS文件下载到ECS中.py

文章来源:https://blog.csdn.net/weixin_67276852/article/details/135105524
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。