【问题标题】:Azure Blob - Read using PythonAzure Blob - 使用 Python 读取
【发布时间】:2018-07-30 13:51:11
【问题描述】:

谁能告诉我是否可以直接从 Azure blob 存储中读取 csv 文件作为流并使用 Python 处理它?我知道它可以使用 C#.Net(如下所示)来完成,但想知道 Python 中的等效库来做到这一点。

CloudBlobClient client = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference("outfiles");
CloudBlob blob = container.GetBlobReference("Test.csv");*

【问题讨论】:

  • @Jay..你对此有什么意见吗?

标签: python azure azure-blob-storage


【解决方案1】:

是的,当然可以这样做。查看Azure Storage SDK for Python

from azure.storage.blob import BlockBlobService

block_blob_service = BlockBlobService(account_name='myaccount', account_key='mykey')

block_blob_service.get_blob_to_path('mycontainer', 'myblockblob', 'out-sunset.png')

您可以在此处阅读完整的 SDK 文档:http://azure-storage.readthedocs.io

【讨论】:

  • 感谢 Gaurav。我检查了页面,但看不到与 Python 等效的 GetBlobReference 类。
  • 因此您不会像在 .Net SDK 中那样获得对 BlockBlob 的引用。我已经编辑了我的代码以展示如何将 blob 下载到本地文件系统,并添加了指向 SDK 文档的链接。 HTH。
  • 我知道 Python SDK 存在此功能,但我正在寻找类似于 .Net 的功能
  • 所以如果我理解正确,您希望在 Python 中创建 BlockBlob 的实例(如 CloudBlockBlob)。正确的?你介意解释一下背后的原因吗?
  • 它与我们现有的一些作品保持一致...我需要从 blob 中读取文件作为流,进行一些处理并将其写回 blob。整个 Python 应用程序将作为 webjob 运行。我知道我可以将文件从 blob 下载到 Webjob 控制台 (D:) 但想知道 Python 中是否有类似的 .Net 功能,而无需在驱动器中下载文件。
【解决方案2】:

这是使用new version of the SDK (12.0.0) 的一种方法:

from azure.storage.blob import BlobClient

blob = BlobClient(account_url="https://<account_name>.blob.core.windows.net"
                  container_name="<container_name>",
                  blob_name="<blob_name>",
                  credential="<account_key>")

with open("example.csv", "wb") as f:
    data = blob.download_blob()
    data.readinto(f)

详情请见here

【讨论】:

  • 嗨,这仍然会下载文件。是否可以在不下载文件的情况下获取 blob 的内容?
  • 当您执行data = blob.download_blob() 时,blob 的内容将在data 中,您无需写入文件。
  • @SebastianDziadzio 有没有办法将这些数据读入 python 数据框?我无法使用 blockblovservice 工作
  • 如果您正在下载 CSV 文件,您应该能够将 data 的内容转换为带有 pd.read_csv(data) 的数据框。
【解决方案3】:

在此处提供您的 Azure 订阅 Azure 存储名称和密钥作为帐户密钥

block_blob_service = BlockBlobService(account_name='$$$$$$', account_key='$$$$$$')

这仍然会获取 blob 并在当前位置保存为 'output.jpg'

block_blob_service.get_blob_to_path('you-container_name', 'your-blob', 'output.jpg')

这将从 blob 中获取文本/项目

blob_item= block_blob_service.get_blob_to_bytes('your-container-name','blob-name')

    blob_item.content

【讨论】:

    【解决方案4】:

    可以像这样使用 python 从 blob 流式传输:

    from tempfile import NamedTemporaryFile
    from azure.storage.blob.blockblobservice import BlockBlobService
    
    entry_path = conf['entry_path']
    container_name = conf['container_name']
    blob_service = BlockBlobService(
                account_name=conf['account_name'],
                account_key=conf['account_key'])
    
    def get_file(filename):
        local_file = NamedTemporaryFile()
        blob_service.get_blob_to_stream(container_name, filename, stream=local_file, 
        max_connections=2)
    
        local_file.seek(0)
        return local_file
    

    【讨论】:

    【解决方案5】:

    我推荐使用smart_open

    from smart_open import open
    
    # stream from Azure Blob Storage
    with open('azure://my_container/my_file.txt') as fin:
        for line in fin:
            print(line)
    
    # stream content *into* Azure Blob Storage (write mode):
    with open('azure://my_container/my_file.txt', 'wb') as fout:
        fout.write(b'hello world')
    

    【讨论】:

      【解决方案6】:

      我知道这是一篇旧帖子,但如果有人想做同样的事情。 我可以按照以下代码访问

      注意:您需要设置 AZURE_STORAGE_CONNECTION_STRING,可以从 Azure 门户获取 -> 转到您的存储 -> 设置 -> 访问密钥,然后您将在那里获得连接字符串。

      对于 Windows: setx AZURE_STORAGE_CONNECTION_STRING ""

      对于 Linux: 导出 AZURE_STORAGE_CONNECTION_STRING=""

      对于 macOS: 导出 AZURE_STORAGE_CONNECTION_STRING=""

      import os
      from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient, __version__
      
      connect_str = os.getenv('AZURE_STORAGE_CONNECTION_STRING')
      print(connect_str)
      blob_service_client = BlobServiceClient.from_connection_string(connect_str)
      container_client = blob_service_client.get_container_client("Your Storage Name Here")
      try:
      
          print("\nListing blobs...")
      
          # List the blobs in the container
          blob_list = container_client.list_blobs()
          for blob in blob_list:
              print("\t" + blob.name)
      
      except Exception as ex:
          print('Exception:')
          print(ex)
      

      【讨论】:

        【解决方案7】:

        以下是使用 Pandas 从 Blob 读取 CSV 的简单方法:

        import os
        from azure.storage.blob import BlobServiceClient
        
        service_client = BlobServiceClient.from_connection_string(os.environ['AZURE_STORAGE_CONNECTION_STRING'])
        client = service_client.get_container_client("your_container")
        bc = client.get_blob_client(blob="your_folder/yourfile.csv")
        data = bc.download_blob()
        with open("file.csv", "wb") as f:
           data.readinto(f)
        df = pd.read_csv("file.csv")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-01
          • 2021-08-30
          • 2021-12-18
          • 1970-01-01
          • 2016-10-12
          • 2017-03-17
          • 1970-01-01
          • 2021-10-05
          相关资源
          最近更新 更多