You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从超大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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:21:59