如何从超大JSON文件中获取首个键(Python+MyPy+NLP/ML场景)
获取大体积JSON的首个键(适配MyPy类型检查)
嘿,针对你在NLP/ML场景下处理超大JSON文件、同时用MyPy做类型检查的需求,我来给你梳理下解决方案~
首先先纠正你代码里的小笔误:循环里的jsonKey应该是jsonKeys,不过重点还是怎么高效拿到首个键。
核心思路:内存友好的首键获取
因为你的JSON文件体积极大,绝对不要用list(rootJson.keys())[0]——这种方式会把所有键加载到内存里,很容易触发内存溢出。更高效的方式是利用Python迭代器的特性,只取第一个键:
from typing import Dict, Any, Optional, List import json from Models.NewsDataModel import NewsDataModel, CreateNewNewsModelFromJson jsonDataPath = "../DataSource/evileye-quorraengine-News-export.json" # 给rootJson加上类型注解,让MyPy能正确做类型检查 rootJson: Dict[str, Any] = json.load(open(jsonDataPath)) def GetNewsData(max:int=0, hasMaxValue:bool=False)->List[NewsDataModel]: newsDataList = [] # 获取首个键,同时处理空JSON的情况(返回None避免报错) first_news_key: Optional[str] = next(iter(rootJson.keys()), None) if first_news_key is not None: # 拿到首个键对应的新闻数据,转成你的NewsDataModel first_news_data = CreateNewNewsModelFromJson(rootJson[first_news_key]) newsDataList.append(first_news_data) # 如果你需要继续处理更多键,可以保留循环逻辑(按需调整) # for newsDataKey in rootJson.keys(): # news_data = CreateNewNewsModelFromJson(rootJson[newsDataKey]) # newsDataList.append(news_data) # if hasMaxValue and len(newsDataList) >= max: # break return newsDataList
关键细节说明
- 内存效率:
iter(rootJson.keys())返回迭代器,next()只取第一个元素,不会加载所有键到内存,完美适配超大JSON场景。 - MyPy类型兼容:给
rootJson标注Dict[str, Any],给first_news_key标注Optional[str],确保MyPy能通过类型检查,不会抛出类型错误。 - 空值处理:
next(..., None)的写法能避免JSON为空时抛出StopIteration异常,代码更健壮。
如果你的Python版本是3.10+,可以用更简洁的str | None代替Optional[str]:
first_news_key: str | None = next(iter(rootJson.keys()), None)
内容的提问来源于stack exchange,提问作者softmarshmallow
相关产品推荐
相关产品推荐

