Скопируйте файлы из контейнера больших двоичных объектов в другой контейнер с помощью python

Я пытаюсь скопировать «конкретные файлы» из одной папки в другую. когда я пытаюсь использовать оператор подстановочных знаков (*) в конце, копирование не происходит.

Но если я укажу только имя папки, то все файлы из этой исходной папки будут без проблем скопированы в целевую папку.

Проблема: Копирование файла не происходит при использовании оператора подстановочного знака. Не могли бы вы помочь мне решить проблему?

def copy_blob_files(account_name, account_key, copy_from_container, copy_to_container, copy_from_prefix):
  try:
    blob_service = BlockBlobService(account_name=account_name, account_key=account_key)
    files = blob_service.list_blobs(copy_from_container, prefix=copy_from_prefix)

    for f in files:
      #print(f.name)
      blob_service.copy_blob(copy_to_container, f.name.replace(copy_from_prefix,""), f"https://{account_name}.blob.core.windows.net/{copy_from_container}/{f.name}")
  except:
    print('Could not copy files from source to target')

copy_from_prefix = 'Folder1/FileName_20191104*.csv'
copy_blob_files (accountName, accesskey, copy_fromcontainer, copy_to_container, copy_from_prefix)

person Idleguys    schedule 04.11.2019    source источник


Ответы (2)


Метод copy_blob не поддерживает подстановочные знаки.

1. Если вы хотите скопировать указанный шаблон больших двоичных объектов, вы можете отфильтровать большие двоичные объекты в методе list_blobs() с префиксом (он также не поддерживает подстановочные знаки). В вашем случае префикс выглядит как copy_from_prefix = 'Folder1/FileName_20191104', обратите внимание, что нет подстановочного знака.

Приведенный ниже код работает на моей стороне, и все указанные файлы шаблонов являются копиями, а имя BLOB-объекта заменено:

from azure.storage.blob import BlockBlobService

account_name ="xxx"
account_key ="xxx"

copy_from_container="test7"
copy_to_container ="test4"

#remove the wildcard
copy_from_prefix = 'Folder1/FileName_20191104'

def copy_blob_files(account_name, account_key, copy_from_container, copy_to_container, copy_from_prefix):
    try:
        block_blob_service = BlockBlobService(account_name,account_key)
        files = block_blob_service.list_blobs(copy_from_container,copy_from_prefix)
        for file in files:
            block_blob_service.copy_blob(copy_to_container,file.name.replace(copy_from_prefix,""),f"https://{account_name}.blob.core.windows.net/{copy_from_container}/{file.name}")

    except:
        print('could not copy files')

copy_blob_files(account_name,account_key,copy_from_container,copy_to_container,copy_from_prefix)

2. Другим способом, как уже упоминалось, вы можете использовать python для вызова azcopy (вы можете использовать azcopy v10, который представляет собой просто файл .exe). А для использования подстановочных знаков в azcopy вы можете следовать этому doc. Затем вы пишете свою собственную команду azcopy, наконец, напишите свой код Python, как показано ниже:

import subprocess

#the path of azcopy.exe, v10 version
exepath = "D:\\azcopy\\v10\\azcopy.exe"

myscript= "your azcopy command"

#call the azcopy command
subprocess.call(myscript)
person Ivan Yang    schedule 05.11.2019
comment
Большое спасибо за ваш вклад. Мне нравится первый вариант, и я проверил его с моими файлами. Это сработало хорошо :) - person Idleguys; 05.11.2019

AzCopy поддерживает подстановочные знаки, вы можете исключить AzCopy из своего кода Python.

Пример того, как это сделать, можно найти здесь: Как запустить Azure Команды CLI с использованием Python?

person Shiraz Bhaiji    schedule 04.11.2019
comment
Я сомневаюсь, что это доступно в azure sdk..github.com/Azure /azure-sdk-for-python/issues/6306 - person Idleguys; 04.11.2019