【问题标题】:Copy files from blob container to another container using python使用python将文件从blob容器复制到另一个容器
【发布时间】:2020-03-01 03:05:29
【问题描述】:

我正在尝试将“特定文件”从一个文件夹复制到另一个文件夹。当我最后尝试使用通配符运算符 (*) 时,不会发生复制。

但如果我只提供文件夹名称,则此源文件夹中的所有文件都将复制到目标文件夹,没有任何问题。

问题:使用通配符运算符时不会发生文件复制。 你能帮我解决这个问题吗?

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)

【问题讨论】:

    标签: azure azure-blob-storage azure-sdk-python


    【解决方案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)
    

    【讨论】:

    • 非常感谢您的意见。我喜欢第一个选项,我用我的文件进行了测试。效果很好:)
    【解决方案2】:

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

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

    【讨论】:

    猜你喜欢
    • 2015-07-16
    • 2020-12-06
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2022-06-15
    • 2020-05-07
    • 2020-01-27
    相关资源
    最近更新 更多