Как перебрать block_blob_service.copy_blob в Python - PullRequest
0 голосов
/ 16 июня 2019

Я копирую файлы из URL в лазурный блоб, используя цикл for, моя проблема: я не знаю, как сказать функции, чтобы она ожидала завершения операции, прежде чем начинать следующую

В настоящее время я использую этот обходной путь

import re
from azure.storage.blob import BlockBlobService
block_blob_service = BlockBlobService(account_name='xxxxx',
                                      account_key='xxxxxxxxxx')
from urllib.request import urlopen
import time
container_name ='yyyyyyyyyyy'



url = "http://nemweb.com.au/Reports/Current/Daily_Reports/"
result = urlopen(url).read().decode('utf-8')

pattern = re.compile(r'[\w.]*.zip')
filelist = pattern.findall(result )
for x in filelist:
      block_blob_service.copy_blob(container_name,x,url+x)
      time.sleep(60)

1 Ответ

1 голос
/ 17 июня 2019

Немного лучшим решением является использование метода get_blob_properties в целевом BLOB-объекте для проверки состояния операции копирования.

Вы можете проверить исходный код copy_blob, как показано на скриншоте ниже:

enter image description here

Итак, в вашем коде цикла for вы можете написать что-то вроде следующего:

for x in filelist:
    block_blob_service.copy_blob(container_name,x,url+x)
    copy_status = block_blob_service.get_blob_properties(container_name,x)

    #use code below to check the copy status, if it's completed or not.
    while(str(copy_status.properties.copy.status) != "success"):
        copy_status = block_blob_service.get_blob_properties(container_name,x)

Кстати: а также вы можете отметить, что естьrequires_sync параметр для метода copy_blob, если он назначен на True, то операция копирования является операцией синхронизации, которая может гарантировать, что следующая будет ждать до завершения предыдущей.Но в настоящее время он доступен только для копий больших двоичных объектов (из и в) для больших двоичных объектов в учетной записи хранения Azure, но не поддерживает сторонний URL-адрес, который вы использовали в посте.

...