如何使用Python高效列出Azure Blob中的所有文件?
优化Azure Blob大量文件列表查询的方法
针对你遇到的大量文件列表查询过慢的问题,可以通过以下几个核心优化点提升效率:
1. 使用list_blob_names()替代list_blobs()
原代码中list_blobs()会返回包含完整属性的BlobItem对象(如文件大小、修改时间等),但你只需要文件名,多余的数据会增加网络传输和本地序列化的开销。list_blob_names()专门只返回文件名字符串,能大幅减少数据传输量。
优化后的代码:
import os, uuid from azure.storage.blob import BlobServiceClient, __version__ connect_str = "************" blob_service_client = BlobServiceClient.from_connection_string(connect_str) container_client = blob_service_client.get_container_client("blobName") # 直接获取所有blob名称,无需手动循环append blob_names = list(container_client.list_blob_names())
2. 增大分页返回数量
Azure Blob的列表接口默认每页返回1000条数据,你可以通过results_per_page参数设置为允许的最大值(5000),减少HTTP请求的总次数,进一步提升速度。
示例代码:
# 每页返回5000条,降低请求频次 blob_names = list(container_client.list_blob_names(results_per_page=5000))
3. 异步批量获取(百万级文件场景)
如果文件量达到百万级以上,可使用异步版本的SDK并行处理分页请求,利用IO等待时间处理其他请求,提升整体效率。
首先安装异步依赖:
pip install azure-storage-blob[aio]
异步代码示例:
import asyncio from azure.storage.blob.aio import BlobServiceClient connect_str = "************" async def get_all_blob_names(): blob_service_client = BlobServiceClient.from_connection_string(connect_str) async with blob_service_client: container_client = blob_service_client.get_container_client("blobName") blob_names = [] # 异步遍历分页结果,每页5000条 async for blob_name in container_client.list_blob_names(results_per_page=5000): blob_names.append(blob_name) return blob_names # 执行异步函数 blob_names = asyncio.run(get_all_blob_names())
额外建议
- 避免在遍历过程中执行写入文件、数据库等额外IO操作,先一次性获取所有文件名后再批量处理后续逻辑。
- 若存储账户启用了分层命名空间(Data Lake Storage Gen2),可使用
container_client.list_paths()方法,该方法针对目录结构做了优化,列表查询速度会更快。
内容的提问来源于stack exchange,提问作者olli
相关产品推荐
相关产品推荐

