使用Python将OSS文件免费下载到本地:第一步 列举OSS文件

在这里插入图片描述

大家好,我是水滴~~

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

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

系列文章

  • 使用Python将OSS文件免费下载到本地:项目分析和准备工作
  • 使用Python将OSS文件免费下载到本地:第一步 列举OSS文件
  • 使用Python将OSS文件免费下载到本地:第二步 将OSS文件下载到ECS中
  • 使用Python将OSS文件免费下载到本地:第三步 提供一个从ECS中下载和删除文件的接口
  • 使用Python将OSS文件免费下载到本地:第四步 将ECS中文件下载到本地

文章目录

  • 系列文章
  • 1. 本文知识点
    • 1.1 datetime 模块
    • 1.2 OSS Python SDK
    • 1.3 MySQL 连接器
    • 1.4 PyInstaller
  • 2. 代码与解析
    • 2.1 安装依赖
    • 2.2 完整代码
    • 2.3 代码解析
  • 3. 部署
    • 3.1 列出依赖项
    • 3.2 安装依赖项
    • 3.3 运行 Python 文件
    • 3.4 其他部署方式


在上一篇文章中,我们对本项目实战做了分析,以及一些准备工作。本文我们讲解第一步:列举OSS文件,并写入MySQL数据库,为后面的下载提供完整的文件列表。

1. 本文知识点

1.1 datetime 模块

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

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

1.2 OSS Python SDK

阿里云提供了 Python SDK 用于操作对象存储服务(OSS),您可以使用该 SDK 在 Python 应用程序中进行 OSS 的上传、下载、删除等操作。

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

pip install oss2

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文件.py Python文件,下面是完整代码:

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)


# 指定时间的时间戳,这里是:2023年1月1日
timestamp = datetime(2023, 1, 1, 0, 0, 0).timestamp()


# 校验OSS文件
def check_oss_file(oss_key, oss_last_modified):
    # 这里只处理2023年1月1日之前的文件
    if oss_last_modified >= timestamp:
        return False
    # 只处理文件,不处理目录
    if oss_key.endswith('/'):
        return False
    return True


if __name__ == '__main__':
    # 建立与数据库的连接(下面地址根据你的实际情况填写)
    cnx = mysql.connector.connect(user='root', password='root', host='localhost', database='oss', port=3306)
    # 创建一个游标对象
    cursor = cnx.cursor()

    # 获取 OSS 存储桶对象
    bucket = get_bucket()
    # 文件前缀(只列举匹配该前缀的文件)
    prefix = 'app/'

    try:
        # 列举Bucket下的指定前权的文件。
        for obj in oss2.ObjectIterator(bucket, prefix):
            key = obj.key  # 文件名
            last_modified = obj.last_modified  # 最后修改时间
            last_modified_datetime = datetime.fromtimestamp(last_modified)
            size = obj.size  # 文件大小

            print(str(last_modified_datetime) + '\t' + str(key))

            # 校验OSS文件
            if not check_oss_file(key, last_modified):
                print('不处理')
                continue

            print('插入')
            # 定义要插入的数据,status为0表示未处理
            data = {
                'prefix': prefix,
                'key': key,
                'last_modified': last_modified_datetime,
                'size': size,
                'status': 0,
                'create_time': datetime.now()
            }
            # 编写插入记录的SQL查询
            sql = """
                INSERT INTO oss_file
                (`prefix`, `key`, `last_modified`, `size`, `status`, `create_time`)
                VALUES (%(prefix)s, %(key)s, %(last_modified)s, %(size)s, %(status)s, %(create_time)s)
            """
            try:
                # 执行查询,将数据插入表中
                cursor.execute(sql, data)
            except Exception as e:
                if str(e).index('i_key') > 0:
                    print("重复")
                continue
            # 提交更改到数据库
            cnx.commit()
            print("成功")
    except Exception as e:
        print(e)
        # 关闭游标和数据库连接
        cursor.close()
        cnx.close()

2.3 代码解析

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

  • check_oss_file方法用于验证当前文件的时间是否满足要求,即:只下载指定日期之前的文件。

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

  • oss2.ObjectIterator方法用于列举文件,参数传入OSS存储桶对象和列举的文件前缀,表示只列举此前缀下的文件,其它列举方法可以参见:Python列举文件。该方法默认每次获取100个文件,不断的迭代执行,直到将此前缀下所有文件列举出来为止。

  • 通过for循环遍历可以得到oss2.models.SimplifiedObjectInfo对象,该对象的属性有:

    • key 文件名

    • last_modified 文件的最后修改时间

    • etag HTTP ETag

    • type 文件类型

    • size 文件大小,单位字节

    • storage_class 文件的存储类别,是一个字符串

    • owner owner信息, 类型为: oss2.models.Owner

    • restore_info Object的解冻状态

  • 对于满足条件的文件,将其属性信息存入data 对象中,并插入到数据库,其中status赋值为0,表示还未处理。

  • 插入时如果重复,会触犯i_key唯一索引,这样继续执行下一条即可。

  • 列举完文件后,关闭数据库连接。

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文件.py Python文件拷贝到 Linux 服务器项目根目录下,执行下面命令即可运行该 Python 文件:

python 第一步:列举OSS文件.py

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

nohup python 第一步:列举OSS文件.py > output.log 2>&1 &

这个命令执行以下操作:

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

  • 第一步:列举OSS文件.py是你要运行的Python脚本。

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

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

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

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

3.4 其他部署方式

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

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

pyinstaller -F 第一步:列举OSS文件.py

你可能感兴趣的:(Python入门核心技术,python,开发语言,pip,oss,mysql)