Клиент Minio Python: загрузка байтов напрямую

Я прочитал документы minio и увидел два способа загрузки данных:

  • put_object() для этого нужен поток ввода-вывода
  • fput_object() читает файл на диске

Я хочу протестировать minio и загрузить некоторые данные, которые я только что создал с помощью numpy.random.bytes().

Как загрузить данные, которые хранятся в переменной в интерпретаторе Python?


person guettli    schedule 18.03.2019    source источник


Ответы (3)


Взгляните на io.BytesIO. Это позволяет вам оборачивать байтовые массивы в поток, который вы можете передать в minio.

Например:

import io
from minio import Minio

value = "Some text I want to upload"
value_as_bytes = value.encode('utf-8')
value_as_a_stream = io.BytesIO(value_as_bytes)

client = Minio("my-url-here", ...) # Edit this bit to connect to your Minio server
client.put_object("my_bucket", "my_key", value_as_a_stream , length=len(value_as_bytes))
person Alan    schedule 20.03.2019

Я был в похожей ситуации: пытался сохранить DataFrame pandas в виде файла пера в minio. Мне нужно было хранить байты напрямую с помощью клиента Minio. В итоге код выглядел так:

from io import BytesIO
from pandas import df
from numpy import random
import minio

# Create the client
client = minio.Minio(
    endpoint="localhost:9000",
    access_key="access_key",
    secret_key="secret_key",
    secure=False
)

# Create sample dataset
df = pd.DataFrame({
    "a": numpy.random.random(size=1000),
})

# Create a BytesIO instance that will behave like a file opended in binary mode 
feather_output = BytesIO()
# Write feather file
df.to_feather(feather_output)
# Get numver of bytes
nb_bytes = feather_output.tell()
# Go back to the start of the opened file
feather_output.seek(0)

# Put the object into minio
client.put_object(
    bucket_name="datasets",
    object_name="demo.feather", 
    length=nb_bytes,
    data=feather_output
)

Мне пришлось использовать .seek(0), чтобы minio мог вставлять правильное количество байтов.

person gcharbon    schedule 21.09.2019
comment
что, если я хочу сохранить его как файл csv. - person om tripathi; 20.11.2019
comment
Просто замените BytesIO() на StringIO() и используйте to_csv() вместо to_feather(). Это должно помочь - person gcharbon; 22.11.2019

@gcharbon: это решение мне не подходит. client.put_object() принимает только байты, такие как объекты.

Вот мое решение:

from minio import Minio 
import pandas as pd
import io  

csv_bytes = df.to_csv().encode('utf-8')

csv_buffer = io.BytesIO(csv_bytes)

client.put_object("bucketname", 
                  "objectname",  
                  data=csv_buffer, 
                  length=len(csv_bytes), 
                  content_type='application/csv')
person AvePazuzu    schedule 09.03.2020