从Azure Blob Storage读取文件时遭遇FileNotFoundError问题排查
问题分析与解决
你遇到的错误核心有两个:
np.load参数使用错误:np.load接受的是文件路径、二进制文件对象或字节流,而你传入的是解码后的文本字符串。此时np.load会把这个字符串当作本地文件路径去查找,自然找不到对应文件,所以抛出FileNotFoundError。- 二进制文件处理逻辑错误:
.npy是二进制格式文件,你的read_blob_content函数把下载的二进制内容用decode('utf-8')转成了文本字符串,这不仅破坏了原文件的二进制结构,也不符合np.load的输入要求。
修正方案
步骤1:修改read_blob_content函数
去掉文本解码步骤,直接返回二进制内容,或者将二进制内容包装成BytesIO对象(方便np.load直接读取):
方式一:返回二进制字节
def read_blob_content(storage_account_name, storage_account_key, container_name, blob_name): '''读取Azure Blob Storage中的二进制文件''' blob_service_client = BlobServiceClient(account_url=f"https://{storage_account_name}.blob.core.windows.net", credential=storage_account_key) blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name) blob_stream = blob_client.download_blob() # 直接返回二进制内容,不做解码 return blob_stream.readall()
方式二:直接返回BytesIO对象
from io import BytesIO def read_blob_content(storage_account_name, storage_account_key, container_name, blob_name): '''读取Azure Blob Storage中的二进制文件并包装为BytesIO''' blob_service_client = BlobServiceClient(account_url=f"https://{storage_account_name}.blob.core.windows.net", credential=storage_account_key) blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name) blob_stream = blob_client.download_blob() # 将二进制内容包装为BytesIO,让np.load可以直接读取 return BytesIO(blob_stream.readall())
步骤2:修改np.load的调用方式
- 如果用方式一(返回二进制字节),需要将字节包装成
BytesIO再传入np.load:
from io import BytesIO v3_embedding = np.load(BytesIO(read_blob_content(account_name, account_key, container_name, blob_name)))
- 如果用方式二(返回
BytesIO),可以直接传入:
v3_embedding = np.load(read_blob_content(account_name, account_key, container_name, blob_name))
这样就能正确读取Azure Blob Storage中的.npy文件了。
内容的提问来源于stack exchange,提问作者Marcelino Velasquez
相关产品推荐
相关产品推荐

