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 数据工厂错误地复制单元格值