使用python操作minio的核心是minio-py库,1. 安装库:执行pip install minio;2. 初始化客户端:通过minio()传入服务器地址、密钥和安全设置;3. 创建桶:使用make_bucket()创建新桶或确认桶存在;4. 上传文件:调用fput_object()将本地文件分块上传;5. 下载文件:使用fget_object()将对象下载到本地;6. 列出对象:通过list_objects()遍历桶内文件;7. 获取信息:用stat_object()查看对象元数据;8. 删除对象:调用remove_object()移除指定文件;9. 异常处理:捕获s3error等异常以应对连接、权限、桶或对象不存在等问题;10. 应用场景:minio适用于边缘存储、ai数据集管理、微服务文件服务、灾备归档等企业级需求,其s3兼容性、高可控性和低成本使其成为私有部署和混合云的理想选择,最终实现高效、安全、可扩展的对象存储管理。

Python操作MinIO存储,核心在于
minio-py
上手
minio-py
pip install minio
接着,我们就可以开始和MinIO服务器打交道了。说白了,就是创建一个
Minio
立即学习“Python免费学习笔记(深入)”;
from minio import Minio
from minio.error import S3Error
import os
# 替换为你的MinIO服务器地址和凭证
MINIO_ENDPOINT = "127.0.0.1:9000" # 或者你的域名
MINIO_ACCESS_KEY = "minioadmin"
MINIO_SECRET_KEY = "minioadmin"
MINIO_SECURE = False # 如果是HTTPS,设为True
def run_minio_operations():
try:
# 1. 初始化MinIO客户端
client = Minio(
MINIO_ENDPOINT,
access_key=MINIO_ACCESS_KEY,
secret_key=MINIO_SECRET_KEY,
secure=MINIO_SECURE
)
bucket_name = "my-test-bucket"
object_name = "my-document.txt"
file_path = "local_document.txt"
download_path = "downloaded_document.txt"
# 创建一个本地文件用于上传
with open(file_path, "w") as f:
f.write("Hello, MinIO! This is a test file.")
print(f"本地文件 '{file_path}' 创建成功。")
# 2. 检查并创建桶(如果不存在)
if not client.bucket_exists(bucket_name):
client.make_bucket(bucket_name)
print(f"桶 '{bucket_name}' 创建成功。")
else:
print(f"桶 '{bucket_name}' 已存在。")
# 3. 上传文件
# fput_object 适合大文件,它会分块上传
client.fput_object(
bucket_name,
object_name,
file_path,
content_type="text/plain" # 设定内容类型,浏览器访问时会用到
)
print(f"文件 '{object_name}' 已成功上传到桶 '{bucket_name}'。")
# 4. 下载文件
# fget_object 同样适合大文件
client.fget_object(
bucket_name,
object_name,
download_path
)
print(f"文件 '{object_name}' 已成功下载到 '{download_path}'。")
# 5. 列出桶中的对象
print(f"列出桶 '{bucket_name}' 中的对象:")
objects = client.list_objects(bucket_name, recursive=True)
for obj in objects:
print(f" - {obj.object_name} (大小: {obj.size} 字节)")
# 6. 获取对象信息
stat = client.stat_object(bucket_name, object_name)
print(f"对象 '{object_name}' 的信息:Etag={stat.etag}, Size={stat.size}")
# 7. 删除文件
client.remove_object(bucket_name, object_name)
print(f"文件 '{object_name}' 已从桶 '{bucket_name}' 中删除。")
# 清理本地文件
os.remove(file_path)
os.remove(download_path)
print("本地临时文件已清理。")
except S3Error as e:
print(f"MinIO操作发生S3错误: {e}")
except Exception as e:
print(f"发生未知错误: {e}")
if __name__ == "__main__":
run_minio_operations()这套流程走下来,你会发现用Python操作MinIO,和操作本地文件系统其实没多大区别,只是多了一层网络和认证的概念。
很多人初次接触MinIO,都会觉得它和AWS S3长得太像了,甚至怀疑是不是S3的“精简版”。从API兼容性来说,确实如此,
minio-py
S3是典型的公有云服务,你把数据扔上去,就不用管底层基础设施了,扩容、高可用、数据持久性都由AWS来保障,你只管按量付费。这很省心,尤其适合那些不愿或没有能力管理大量服务器的企业。但缺点也显而易见:数据在别人家,数据主权和合规性有时会成为问题;网络延迟可能会影响性能;长期来看,存储成本可能不低,特别是数据量巨大且访问频繁时。
MinIO则是一款开源的、高性能的对象存储服务器,你可以把它部署在任何地方:你的私有数据中心、边缘设备,甚至是本地开发机。它把S3的能力“下放”到了本地,让你能完全掌控数据。对我个人而言,MinIO的吸引力在于它的“可控性”和“成本效益”。你可以根据自己的硬件资源来构建存储集群,理论上可以无限扩展,而且没有额外的服务费用。这对于需要处理敏感数据、有严格合规要求、或者希望构建混合云架构的企业来说,简直是量身定制。比如,我曾经在做一些边缘计算项目时,就用MinIO来存储设备生成的大量时序数据,既保证了数据本地化处理的低延迟,又避免了频繁上传到公有云的高昂带宽费用。
所以,选择S3还是MinIO,更多是根据你的业务需求、成本预算和对数据控制程度的偏好来决定。它们不是竞争关系,更像是互补的解决方案,一个擅长公有云的便捷,一个则在私有部署和边缘计算领域大放异彩。
尽管
minio-py
minio-py
minio.error.S3Error
from minio import Minio
from minio.error import S3Error, ServerError, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey
# ... (MinIO客户端初始化代码同上)
def safe_upload_file(client, bucket_name, object_name, file_path):
try:
if not client.bucket_exists(bucket_name):
print(f"桶 '{bucket_name}' 不存在,尝试创建...")
client.make_bucket(bucket_name)
print(f"桶 '{bucket_name}' 创建成功。")
client.fput_object(bucket_name, object_name, file_path)
print(f"文件 '{object_name}' 上传成功。")
except BucketAlreadyOwnedByYou:
# 这个错误通常发生在尝试创建已经属于你的桶时,可以忽略
print(f"桶 '{bucket_name}' 已经存在,无需重复创建。")
except S3Error as e:
# 捕获所有S3相关的错误
if e.code == "AccessDenied":
print(f"权限不足:无法访问桶 '{bucket_name}' 或上传文件。请检查你的Access Key和Secret Key的权限。")
elif e.code == "NoSuchBucket":
print(f"桶不存在:'{bucket_name}'。请确认桶名是否正确或已创建。")
elif e.code == "NoSuchKey":
print(f"对象不存在:'{object_name}'。这通常在下载或删除不存在的对象时发生。")
elif e.code == "InvalidAccessKeyId" or e.code == "SignatureDoesNotMatch":
print(f"认证失败:Access Key或Secret Key不正确。请检查你的凭证。")
else:
print(f"MinIO操作发生S3错误: {e.code} - {e.message}")
except ServerError as e:
# 服务器端错误,例如MinIO服务不可用
print(f"MinIO服务器错误: {e.message}。请检查MinIO服务是否正常运行。")
except ConnectionRefusedError:
print(f"连接被拒绝:无法连接到MinIO服务器 '{MINIO_ENDPOINT}'。请检查IP地址、端口和网络防火墙。")
except Exception as e:
# 捕获其他所有未预料的错误
print(f"发生未知错误: {e}")
# 调用示例
# client = Minio(...)
# safe_upload_file(client, "non-existent-bucket", "test.txt", "some_local_file.txt")在实际项目中,我通常会把这些错误处理封装成更通用的函数,或者集成到日志系统里。关键在于,当你遇到错误时,能够通过异常类型和错误码迅速定位问题。比如,
AccessDenied
NoSuchBucket
MinIO之所以能在开源对象存储领域占有一席之地,不仅仅是因为它兼容S3 API,更在于它在企业级应用中的独特价值。我发现它尤其适合以下几个场景:
轻量级数据湖/数据仓库的边缘存储:对于那些不需要公有云数据湖的复杂生态,但又需要存储和分析大量非结构化数据的场景,比如物联网设备产生的日志、监控视频流、传感器数据等,MinIO提供了一个非常高效且成本可控的解决方案。你可以在边缘设备、小型数据中心部署MinIO,实现数据的本地化存储和初步处理,只有经过清洗和聚合的“精华”数据才上传到中央云端。
机器学习/AI模型训练的数据存储:机器学习项目往往需要处理海量的图片、视频、文本等数据。MinIO可以作为这些数据集的私有存储层,提供高吞吐量和低延迟的访问。数据科学家可以直接从MinIO拉取数据进行模型训练,避免了频繁从公有云下载数据带来的高额流量费和时间延迟。我曾在一个CV(计算机视觉)项目中用MinIO来存储数百万张图片,模型训练时直接挂载MinIO,效率比通过NFS共享文件要高得多。
微服务架构中的文件存储服务:在微服务盛行的今天,每个服务都可能需要存储和访问文件,比如用户上传的头像、文档、临时文件等。MinIO可以作为一个独立的文件存储服务部署,通过RESTful API为所有微服务提供统一的对象存储能力。这比在每个服务内部管理文件系统要灵活得多,也更容易扩展。
灾备和归档存储:虽然MinIO是自建的,但通过多MinIO集群同步、异地部署等方式,它也能构建出相当可靠的灾备方案。对于那些不常访问但又需要长期保存的数据,比如历史审计日志、备份文件等,MinIO的归档存储成本远低于许多商业解决方案。
MinIO的轻量级、高性能和S3兼容性,让它在这些场景下显得格外实用。它不是要取代S3,而是提供了一个强有力的替代方案,尤其是在对数据主权、成本和本地化处理有高要求的环境中。
以上就是Python如何操作MinIO存储?minio-py客户端的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号