使用python将文件从blob容器复制到另一个容器

时间:2019-11-04 18:57:56

标签: azure azure-blob-storage azure-sdk-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)

2 个答案:

答案 0 :(得分:1)

copy_blob方法不支持通配符。

1 。如果您要复制指定的Blob模式,则可以在list_blobs()方法中以前缀过滤Blob(它也不支持通配符)。在您的情况下,前缀看起来像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)

答案 1 :(得分:0)

AzCopy支持通配符,您可以从Python代码中删除AzCopy。

如何执行此操作的示例可以在这里找到:How to run Azure CLI commands using python?

相关问题