Azure 从 Blob 存储中抓取数据 w。 Python(无需下载)

Posted

技术标签:

【中文标题】Azure 从 Blob 存储中抓取数据 w。 Python(无需下载)【英文标题】:Azure Grab Data from Blob Storage w. Python (No downloading) 【发布时间】:2021-12-26 21:24:00 【问题描述】:

我正在尝试打开我们存储在 Azure Blob 存储中的一系列不同的破解文档/文本,理想情况下将它们全部推送到 pandas db。我不想下载它们(我将从 Docker 容器中打开它们),我只想将信息存储在内存中。

文件结构如下:Azure Blob Storage -> MyContainer -> UUIDFolderNames (many) -> 每个文件夹中有 1 个“knowledge.json”文件。

我的工作:

container = ContainerClient.from_connection_string( <my connection str>, <MyContainer> )
blob_list = container.list_blobs()
for blob in blob_list:
    blobClient = container.get_blob_client( blob ) #Not sure this is needed

理想情况下,对于我的 for 循环中的每个项目,我会做一些事情,比如打开 .json 文件,然后将它的文本添加到我的数据框中的一行。但是,我实际上无法打开任何 JSON 文件。

我尝试过的:

#1
name = blob.name 
json.loads( name )

#2
with open(name, 'r') as f:
    data = json.load( f )

错误:

#1 Json 解码器错误预期值:第 1 行第 1 列 (char 0)

#2:没有这样的文件或目录

我尝试过其他更愚蠢的东西,比如 json.loads(blob) 或 json.loads('knowledge.json')(路径中没有文件夹名称),但我只是想看看这些有点荒谬他们工作,他们并不完全合理。

大多数方法(包括 Azure 文档中的方法)首先下载文件,但同样,我不想下载文件。

*编辑:我意识到为什么找不到文件有点明显 - json.load 等将在我的本地目录/我正在运行 python 文件的地方查找,而不是 blob 位置。不过,不知道如何在不下载文件的情况下加载文件。

【问题讨论】:

您不能只将 Azure 存储 blob 作为文件打开,因为它不是文件,并且除了下载或作为流打开之外没有文件处理。如果要将 blob 作为文件使用,则需要改用文件共享(它提供 SMB 支持)。 Blob 存储没有计算组件,因此除非您将内容下载(或流式传输)到代码所在的位置,否则真的无法使用它。 流媒体需要下载吗?现在研究一下,我看到的一两个示例确实包括下载流式信息。我假设从你所说的 Azure blob 存储的结构/目的来看,答案是肯定的,仍然需要下载 是的,流式传输本质上是下载到应用程序代码运行的任何地方(尽管不一定写入磁盘)。例如,除了使用工具在存储容器之间复制内容之外,真的没有办法解决这个问题。我不太确定您关心的是什么:如果您的存储与计算位于同一区域,则数据移动速度非常快,并且没有带宽出口费用。 【参考方案1】:

借助以下块,您将能够查看 JSON blob:

for  blobs  in  container_client.list_blobs():
    blob_client = service_client.get_blob_client(container=Container_name, blob=blobs)
    content = blob_client.download_blob()
    contentastext = content.readall()
    print(contentastext)

以下是从 blob 中读取 JSON 文件的完整代码,稍后您可以将此数据添加到数据帧中:

from  azure.storage.blob  import  BlobServiceClient, BlobClient, ContainerClient,PublicAccess
import  os
import  logging
import  sys
import  azure.functions  as  func
from  azure.storage  import  blob
from  azure.storage.blob  import  BlobServiceClient, BlobClient, ContainerClient, __version__

def  UploadFiles():
    CONNECTION_STRING="ENTER_CONNECTION_STR"    
    Container_name="gatherblobs"    
    service_client=BlobServiceClient.from_connection_string(CONNECTION_STRING)    
    container_client = service_client.get_container_client(Container_name)

    for  blobs  in  container_client.list_blobs():
        blob_client = service_client.get_blob_client(container=Container_name, blob=blobs)
        content = blob_client.download_blob()
        contentastext = content.readall()
        print(contentastext)

if  __name__ == '__main__':
    UploadFiles()

【讨论】:

您正在编写很多与 OP 的问题无关的代码。事实上,您正在做的正是 OP 不想做的事情:下载内容(通过 download_blob())。是的,这确实是一种正确的做事方式,但是……这应该是评论,而不是答案。 基本上是大卫所说的。我明确希望不要使用“download_blob()”命令。

以上是关于Azure 从 Blob 存储中抓取数据 w。 Python(无需下载)的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure Databricks 将数据写入 Azure Blob 存储

Blob 存储上的 Azure 触发器,从图像 (Blob) 中提取 EXIF (lat/long/direction...) 数据

将最新的文件夹从 azure blob 存储加载到 azure 数据工厂

将数据从 Azure Blob 存储复制到 Azure SQLDB 时,Azure 数据工厂错误地复制单元格值

如何使用数据工厂将数据从 Azure Blob 存储增量加载到 Azure SQL 数据库?

从 AKS 访问 Azure Blob 存储