我正在尝试打开我们存储在 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 位置。不过,不知道如何加载文件而不下载它。
有类似的案例并使用 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。
借助以下块,您将能够查看 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()