Используйте Python для создания нескольких контейнеров с определенным содержимым - PullRequest
0 голосов
/ 17 марта 2019

В моем хранилище BLOB-объектов есть один контейнер с около 200 КБ изображений. Я хочу написать скрипт на Python, который копирует партии из 20 КБ этих изображений в новые контейнеры, называемые что-то вроде imageset1, imageset2, ..., imageset20 (в последнем контейнере будет менее 20 000 изображений, и это нормально).

Пока у меня есть следующее:

from azure.storage.blob import BlockBlobService 
from io import BytesIO from shutil
import copyfileobj 
with BytesIO() as input_blob: 
   with BytesIO() as output_blob:
block_blob_service = BlockBlobService(account_name='my_account_name', account_key='my_account_key')

# Download as a stream 
block_blob_service.get_blob_to_stream('mycontainer', 'myinputfilename', input_blob) 


# Here is where I want to chunk up the container contents into batches of 20k


# Then I want to write the above to a set of new containers using, I think, something like this... 
block_blob_service.create_blob_from_stream('mycontainer', 'myoutputfilename', output_blob)

Это разбивка содержимого контейнера и запись результатов в новые контейнеры, что я не знаю, как сделать. Кто-нибудь может помочь?

1 Ответ

1 голос
/ 19 марта 2019

Вот мой пример кода для реализации ваших потребностей, и он работает на моем контейнере.

from azure.storage.blob.baseblobservice import BaseBlobService

account_name = '<your account name>'
account_key = '<your account key>'
container_name = '<the source container name>'

blob_service = BaseBlobService(
    account_name=account_name,
    account_key=account_key
)

blobs = blob_service.list_blobs(container_name)

# The target container index starts with 1
container_index = 1
# The blob number in new container, such as 3 in my testing 
num_per_container = 3
count = 0
# The prefix of new container name
prefix_of_new_container = 'imageset'
flag_of_new_container = False

for blob in blobs:
    if flag_of_new_container == False:
        flag_of_new_container = blob_service.create_container("%s%d" % (prefix_of_new_container, container_index))
    print(blob.name, "%s%d" % (prefix_of_new_container,container_index))
    blob_service.copy_blob("%s%d" % (prefix_of_new_container, container_index), blob.name, "https://%s.blob.core.windows.net/%s/%s" % (account_name, container_name, blob.name))
    count += 1
    if count == num_per_container:
        container_index += 1
        count = 0
        flag_of_new_container = False

Примечание: я использую только BaseBlobService, потому что этого достаточно для ваших нужд, даже для AppendBlob или PageBlob.Также вы можете использовать BlockBlobService вместо него.

...