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

在这里插入图片描述

大家好,我是水滴~~

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

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

系列文章

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

文章目录

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


在上一篇文章中,我们提供了一个从ECS服务器中下载和删除文件的接口。这篇文章是我们继续讲解第四步:将ECS中文件下载到本地。

1. 本文知识点

1.1 datetime 模块

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

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

1.2 base64 模块

base64 是 Python 标准库中的一个模块,提供了对 Base64 编码和解码的功能。Base64 是一种将二进制数据转换为 ASCII 字符串的编码方式,常用于在文本协议中传输二进制数据或存储二进制数据到文本文件中。

更多介绍参见:《Base64 编码和解码(base64 模块)》

1.3 os 模块

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

更多介绍参见:《os 模块》

1.4 psutil 库

psutil是一个跨平台的Python库,它提供了对系统进程和系统资源利用情况的访问接口。使用psutil,您可以轻松地获取有关CPU、内存、磁盘、网络、传感器和系统进程等方面的信息。

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

pip install psutil

1.5 MySQL 连接器

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

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

pip install mysql-connector-python

1.6 PyInstaller

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

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

pip install pyinstaller

1.7 requests 库

requests是一个流行的Python库,用于发送HTTP请求和处理响应。它提供了简单且直观的API,使得与Web服务进行交互变得容易。

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

pip install requests

2. 代码与解析

2.1 安装依赖

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

pip install psutil
pip install requests
pip install mysql-connector-python

2.2 完整代码

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

import base64
import os
import time
from datetime import datetime

import mysql.connector
import psutil
import requests

# # 文件本地存储路径
file_path = "E:/oss_download/file_list/"
# 请求地址(第三步中的服务外网地址)
request_path = 'http://*.*.*.*:8080/'


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


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


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

    while True:
        try:
            # 查询前10个待下载到本地的数据,执行查询
            cursor.execute('select id, key from oss_file where status = 2 order by last_modified limit 10')
            # 获取查询结果,结果为元组类型
            results = cursor.fetchall()
            # 查询结果为空,跳出本次循环
            if len(results) == 0:
                print("-------全部处理完了吗?")
                # 休眠10分钟
                time.sleep(600)
                continue
            # 遍历查询结果,逐个下载
            for row in results:
                # 打印该文件
                data = {
                    'id': row[0],
                    'key': row[1]
                }
                key = data['key']
                print(key)
                # 远程下载到本地
                key_base64 = base64.b64encode(key.encode()).decode()
                request_url = request_path + 'download/' + key_base64  # 文件下载URL
                file_name = file_path + key  # 下载后保存的文件名
                makedirs(file_name)
                # 发送GET请求并获取响应
                response = requests.get(request_url)
                # 检查响应状态码
                if response.status_code == 200:
                    # 打开文件并将响应内容写入文件
                    with open(file_name, 'wb') as file:
                        file.write(response.content)
                    print(key + '\t文件下载完成')

                    # 修改数据状态
                    data['update_time'] = datetime.now()
                    cursor.execute('update oss_file set status = 3, update_time = %(update_time)s where id = %(id)s',
                                   data)
                    # 提交更改到数据库
                    cnx.commit()

                    # 远程删除文件
                    request_url = request_path + 'delete/' + key_base64  # 文件删除URL
                    # 发送GET请求并获取响应
                    response = requests.get(request_url)
                    if response.status_code == 200:
                        msg = response.text
                        if msg == 'ok':
                            print(key + '\t文件删除完成')
                            # 修改数据状态
                            data['update_time'] = datetime.now()
                            cursor.execute(
                                'update oss_file set status = 4, update_time = %(update_time)s where id = %(id)s', data)
                            # 提交更改到数据库
                            cnx.commit()
                        else:
                            print(key + '\t文件删除失败error')
                    else:
                        print(key + '\t文件删除失败')

                else:
                    print(key + '\t文件下载失败')
            # 下载一轮后,检测一下磁盘空间
            while True:
                if check_disk_space():
                    break
                else:
                    # 休眠10分钟
                    time.sleep(600)
        except Exception as e:
            print(str(e))
            # 休眠1秒
            time.sleep(1)
            continue

2.3 代码解析

  • check_disk_space方法用于检测磁盘剩余空间是否充裕,该方法会输出磁盘大小。这里借助 psutil 三方加来获取磁盘信息。

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

  • main主方法中,首先创建了一个 MySQL 的连接,后面修改状态时会用到。

  • 接着创建一个死循环,用于不断的从ECS上下载/删除文件。

  • 循环中,首先从数据库中查询前10个待处理的文件列表(status为2,并按last_modified 排序),表示先处理最旧的数据。

  • 遍历这个文件列表,逐个从ECS服务器中下载到本地计算机中。调用第三步中的download/接口进行下载。下载完成后将该记录的status改为3。

  • 然后再调用第三步中的delete/接口进行删除。请求返回ok后,将该记录的status改为4。

  • 这样处理一轮文件后,检测一下磁盘空间是否充裕,如果充裕就继续处理下一轮,如果不充裕,则休眠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 文件

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

python 第四步:将ECS中文件下载到本地.py

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

nohup python 第四步:将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 第四步:将ECS中文件下载到本地.py

你可能感兴趣的:(Python入门核心技术,python,microsoft,数据库,oss,sql,mysql)