大家好,我是水滴~~
本文将介绍了使用的知识点、以及列举OSS文件的代码、并对该代码进行详细解析、最后给出部署方案,希望能对你有所帮助!
在上一篇文章中,我们对本项目实战做了分析,以及一些准备工作。本文我们讲解第一步:列举OSS文件,并写入MySQL数据库,为后面的下载提供完整的文件列表。
datetime模块是Python标准库中用于处理日期和时间的模块。它提供了多个类来处理日期、时间、时间间隔等,并且支持日期时间的运算和格式化。
更多介绍参见:《日期和时间(time、datetime、calendar 模块》
阿里云提供了 Python SDK 用于操作对象存储服务(OSS),您可以使用该 SDK 在 Python 应用程序中进行 OSS 的上传、下载、删除等操作。
在使用前需要先安装该库,下面是安装命令:
pip install oss2
mysql-connector-python 是 MySQL 官方提供的 Python 连接器,用于在 Python 应用程序中与 MySQL 数据库进行交互。它是一个纯 Python 实现的驱动程序,可以通过它执行 SQL 查询、插入、更新、删除等操作。
在使用前需要先安装该库,下面是安装命令:
pip install mysql-connector-python
PyInstaller 是一个用于将 Python 应用程序打包成独立可执行文件的工具。它可以将 Python 代码及其依赖项(包括解释器)打包成单个可执行文件,这样用户可以在没有安装 Python 解释器或依赖项的情况下运行你的应用程序。你可以使用 PyInstaller 来创建跨平台的可执行文件,支持 Windows、macOS 和 Linux 等操作系统。
在使用前需要先安装该库,下面是安装命令:
pip install pyinstaller
下面代码使用了 oss2
和 mysql-connector-python
两个第三方库,所以要提前安装它们,下面是安装指令:
pip install oss2
pip install mysql-connector-python
首选创建一个项目,名称你随意,然后在项目中创建一个第一步:列举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()
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
唯一索引,这样继续执行下一条即可。
列举完文件后,关闭数据库连接。
requirements.txt
是一个常用的文本文件,用于列出项目所需的所有依赖项及其版本信息。它通常用于 Python 项目,但也可以在其他项目中使用。
在项目中执行下面命令,可以列出依赖项:
pip freeze > requirements.txt
这将输出当前环境中所有安装的包及其版本信息,并将其写入requirements.txt
文件中。
在 Linux 服务器的项目根目录下,可以运行以下命令来安装requirements.txt
中列出的所有依赖项:
pip install -r requirements.txt
这将安装所列出的所有依赖项及其指定的版本。
将 第一步:列举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输出写入到指定的日志文件中。
如果你想部署在Windows服务器下,一个简单的方式就是通过 PyInstaller 来打包部署。它可以将Python代码及其依赖项(包括解释器)打包成单个可执行文件,这样即使服务器没有安装Python环境也可以运行你的应用程序。
下面命令可以将上面的Python脚本打包成一个exe
的可执行文件:
pyinstaller -F 第一步:列举OSS文件.py