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

问题描述 投票:0回答:2

我正在尝试打开我们存储在 Azure Blob 存储中的一系列不同的破解文档/文本,理想情况下将它们全部推送到 pandas 数据库中。我不想下载它们(我将从 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 列(字符 0)

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

我尝试过其他更愚蠢的事情,例如 json.loads( blob ) 或 json.loads('knowledge.json') (路径中没有文件夹名称),但这些都是有点无意义的事情,我只是想看看它们是否有效,他们并不完全合理。

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

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

python json azure azure-blob-storage
2个回答
0
投票

有类似的案例并使用 ADLFS 解决了它(https://github.com/fsspec/adlfs

它允许对 azure blob 存储进行类似文件系统的操作。

还有错误“#1 Json Decoder Error Expecting Value: line 1 column 1 (char 0)”可能是由于 JSON 开头的 UTF-8 BOM 编码字节造成的(在我的情况下,这是问题所在,必须强制执行)编码 - utf-8-sig。


-2
投票

借助以下块,您将能够查看 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()
© www.soinside.com 2019 - 2024. All rights reserved.