Python Package

minio

2023-03-25

minio 是 [[MinIO]] 官方提供的 [[Python]] SDK,用于操作 MinIO 对象存储服务。

安装

通过 [[pip]] 安装:

Terminal window
pip install minio

在 Python 中创建客户端:

from minio import Minio
# 创建 Minio 客户端
client = Minio("play.min.io",
access_key="Q3AM3UQ867SPQQA43P2F",
secret_key="zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG",
)

然后就可以调用对应 API 进行操作了。

另外如果是内网的 IP 地址,可能需要加上 secure 参数,并设为 False,不然可能会报错: urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host=‘10.1.1.11’, port=80): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, ‘[SSL] record layer failure (_ssl.c:1000)‘)))

API

Bucket

list_buckets

列出所有 bucket 信息(可访问): client.list_buckets()

buckets = client.list_buckets() # -> list
for bucket in buckets:
print(bucket.name, bucket.creation_date)

好像只能获取 namecreation_date 两个数据。

对象

list_objects

列出对应 bucket 中所有数据: client.list_objects(bucket_name)

objects = client.list_objects("my-bucket") # -> generator
for obj in objects:
print(obj)

可选参数:

  • prefix: 指定前缀(如果前缀是目录名称,需要把 recursive 设为 True)
  • recursive: 是否递归列出所有子目录

put_object

上传文件 (数据流): client.put_object(bucket_name, object_name, data, length=len(data))

client.put_object("my-bucket", "my-object", data, length=len(data), content_type="application/octet-stream")

参数:

  • bucket_name: 桶名称
  • object_name: 文件名称
  • data: 数据流
  • length: 数据流长度

可选参数:

  • content_type: 内容类型

fput_object

上传文件 (本地文件): client.fput_object(bucket_name, object_name, file_path)

client.fput_object("my-bucket", "my-object", "local/file.txt", content_type="application/octet-stream")

参数:

  • bucket_name: 桶名称
  • object_name: 文件名称
  • file_path: 文件路径

可选参数:

  • content_type: 内容类型

get_object

下载文件 (数据流): client.get_object(bucket_name, object_name) -> urllib3.response.HTTPResponse

response = client.get_object("my-bucket", "my-object")
# 保存到本地
with open("./image.jpg", "wb") as f:
f.write(response.data)

参数:

  • bucket_name: 桶名称
  • object_name: 文件名称

fget_object

下载文件 (到本地): client.fget_object(bucket_name, object_name, file_path)

client.fget_object("my-bucket", "my-object", "./image.jpg")

参数:

  • bucket_name: 桶名称
  • object_name: 文件名称
  • file_path: 本地保存文件路径

get_presigned_url

获取文件的预签名 URL: client.get_presigned_url(method, bucket_name, object_name)

client.get_presigned_url("GET", "my-bucket", "my-object") # -> str

参数:

  • method: 请求方法,如 GET、PUT、POST 等
  • bucket_name: 桶名称
  • object_name: 文件名称

可选参数:

  • expires: 过期时间(单位:秒)

使用

按目录删除

from minio import Minio
from minio.deleteobjects import DeleteObject
delete_object_list = map(
lambda x: DeleteObject(x.object_name),
client.list_objects("my-bucket", "my/prefix/", recursive=True),
)
errors = client.remove_objects("my-bucket", delete_object_list)
for error in errors:
print("error occured when deleting object", error)

最后循环的时候才会实际执行删除操作。

获取数量

通过 [[#list_objects]] 获取到对象后,计算数量:

objects = client.list_objects("my-bucket")
sum(1 for _ in objects)

计算后如果需要继续使用 objects,最好是重新再获取一次。

参考