【问题标题】:Python: How to move or copy Azure Blob from one container to anotherPython:如何将 Azure Blob 从一个容器移动或复制到另一个容器
【发布时间】:2021-05-04 17:51:10
【问题描述】:

我在项目中使用Microsoft Azure SDK for Python。我想将 Blob 从一个容器移动或复制到另一个容器。例如

https://demostorage.blob.core.windows.net/image-container/pretty.jpg

我想将此 blob 移动到

https://demostorage.blob.core.windows.net/demo-container/

我在python SDK中找到了以下方法但无法理解。

def copy_blob(self, container_name, blob_name,...):

我该怎么做?谢谢

【问题讨论】:

    标签: python azure azure-blob-storage


    【解决方案1】:

    我是这样做的。

    from azure.storage.blob import BlobService
    
    def copy_azure_files(self):
    
            blob_service = BlobService(account_name='account_name', account_key='account_key')
            blob_name = 'pretty.jpg'
            copy_from_container = 'image-container'
            copy_to_container = 'demo-container'
    
            blob_url = blob_service.make_blob_url(copy_from_container, blob_name)
            # blob_url:https://demostorage.blob.core.windows.net/image-container/pretty.jpg
    
            blob_service.copy_blob(copy_to_container, blob_name, blob_url)
    
            #for move the file use this line
            blob_service.delete_blob(copy_from_container, blob_name)
    

    我还没有找到任何 Blob Move 方法。所以我使用了复制方法,然后执行 Blob 函数。

    这是我的解决方案。如果您有更好的方法来处理这一切,请与我分享。

    注意:我没有使用任何自定义方法,所有这些方法都包含在 SDK 中。

    【讨论】:

    • Azure 存储本身不支持移动。您可以通过执行复制操作来完成移动操作,等待复制完成(非常重要,因为复制是异步操作)然后对源 blob 执行删除操作。
    • 以为你是想写blob_url = blob_service.make_blob_url(copy_from_container,blob_name) & blob_service.delete_blob(copy_from_container, blob_name)
    • 是否应该将初始导入(from azure.storage.blob import BlobService)更改为from azure.storage.blob.baseblobservice import BaseBlobService?我在Azure SDK for python 中找不到任何BlobService 对象的引用,所以我假设他们将其重构为BaseBlobService...
    • 我觉得你需要导入这个from azure.storage.blob import BlockBlobService
    • 对 blob 服务的复制操作与元数据键的情况相混淆。因此请注意您的 blob 元数据键是否有驼峰式大小写或其他内容,因为它将通过复制操作转换为小写。
    【解决方案2】:

    使用当前版本的 azure-storage-blob(目前为 v12.3.2),您将收到 ImportError:

    cannot import name 'BlockBlobService' from 'azure.storage.blob'
    

    此代码适用于我的情况:

    from azure.storage.blob import BlobServiceClient
    
    # Azure
    # Get this from Settings/Access keys in your Storage account on Azure portal
    account_name = "YOUR_AZURE_ACCOUNT_NAME"
    connection_string = "YOUR_AZURE_CONNECTION_STRING"
    
    # Source
    source_container_name = "sourcecontainer"
    source_file_path = "soure.jpg"
    blob_service_client = BlobServiceClient.from_connection_string(connection_string)
    source_blob = (f"https://{account_name}.blob.core.windows.net/{source_container_name}/{source_file_path}")
    
    # Target
    target_container_name = "targetcontainer"
    target_file_path = "target.jpg"
    copied_blob = blob_service_client.get_blob_client(target_container_name, target_file_path)
    copied_blob.start_copy_from_url(source_blob)
    
    # If you would like to delete the source file
    remove_blob = blob_service_client.get_blob_client(source_container_name, source_file_path)
    remove_blob.delete_blob()
    

    【讨论】:

    • 我在尝试在 Azure Function 中使用时收到“ImportError: cannot import name 'BlobServiceClient' from 'azure.storage.blob'”。我的 azure-storage-blob 版本是 12.3.2 知道如何避免这种情况吗?
    • 可能你的python环境有问题?你在使用虚拟环境吗?在 VSCode 中打开您的函数,然后在 VSCode 终端中尝试“pip freeze”。您将看到使用的库版本。检查是否有当前版本。
    • 有没有办法从一个存储帐户复制到另一个?
    【解决方案3】:

    使用最新的Azure Blob Storage SDK

    from azure.storage.blob import BlockBlobService
    
    account_name = "demostorage"
    account_key = "lkjASDRwelriJfou3lkjksdfjLj349u9LJfasdjfs/dlkjfjLKSjdfi8ulksjdfAlkjsdfkL762FDSDFSDAfju==" 
    
    source_container_name = "image-container"
    source_file_path = "pretty.jpg"
    
    target_container_name = "demo-container"
    target_file_path = "pretty_copy.jpg"
    
    service = BlockBlobService(account_name, account_key)
    
    service.copy_blob(
        target_container_name, 
        target_file_path, 
        f"https://{account_name}.blob.core.windows.net/{source_container_name}/{source_file_path}",
    )
    

    【讨论】:

    • 有没有办法批量处理?我想将 blob 从一个文件夹批量复制到另一个文件夹。
    【解决方案4】:

    sdk 版本 12.0.0b,他们将 copy_blob 更改为 start_copy_from_url。方法大家可以看here

    这是一个关于如何在不下载数据的情况下执行移动机制的快照。

        from azure.storage.blob import BlobServiceClient
    
        blob_service_client = BlobServiceClient.from_connection_string(
                os.getenv("AZURE_STORAGE_CONNECTION_STRING")
            ).get_container_client(self.container)
    
        # azure storage sdk does not have _move method
        source_blob = blob_service_client.get_blob_client(source_blob_path)
        dest_blob = blob_service_client.get_blob_client(dest_blob_path)
    
        dest_blob.start_copy_from_url(source_blob.url, requires_sync=True)
        copy_properties = dest_blob.get_blob_properties().copy
    
        if copy_properties.status != "success":
            dest_blob.abort_copy(copy_properties.id)
            raise Exception(
                f"Unable to copy blob %s with status %s"
                % (source_blob_path, copy_properties.status)
            )
        source_blob.delete_blob()
    

    【讨论】:

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