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

标签 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)

最佳答案

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)

关于azure - 使用 python 将文件从 blob 容器复制到另一个容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58699514/

相关文章:

c# - IS4 : Request not valid for the application's 'userAudience' configuration

c# - 使用 C#(无 JavaScript)将 Blazor WebAssembly 文件直接分块到 Azure Blob 存储

azure - 使用自定义元数据在 Azure 上存储文档

python - 如何使用 python 列出我的 azure 帐户中的所有资源组?

Azure-ML 部署看不到 AzureML 环境(版本号错误)

python - Azure Python SDK : 'ServicePrincipalCredentials' object has no attribute 'get_token'

c# - 无法连接到 Redis 服务器;要创建断开连接的多路复用器,请禁用 AbortOnConnectFail。 PING 上的套接字失败

Azure 管道不会从具有单个 azure-pipelines.yml 文件的分支触发

Azure门户登录身份验证

azure - 使用 Azure 存储 blob URI 作为网站 Assets (即可链接)的一部分是否是个好主意?