Python如何读取打印JSON文件中各国新冠新增病例数据
现有代码的核心问题
你目前没法顺利读到嵌套字段,根源是有个基础bug:你把json.load()加载后返回的结构化Python字典,通过json.dumps(data, indent=2)转成了格式化的纯文本字符串。字符串本身不支持用字典键做索引,后续你拿new_string['AFG']取值,本质上是对字符串做位置切片,根本拿不到结构化的字段内容。
要记住:json.load()读取本地JSON文件后,返回的就是可以直接做键值访问的字典结构,完全不需要额外转成字符串——转成字符串反而把原本可多层访问的结构化数据变成了纯文本,彻底失去了嵌套字段的访问能力。
对应问题的解决方法
1. 嵌套层级的取值语法
你预想的跨层级直接取值的逻辑Python本身就支持,不需要额外工具,只需要注意两个细节:
- Python字典访问多层嵌套是连续使用方括号,不是用点号分隔(点号是JavaScript这类语言的写法)
- 这个JSON的结构里,每个国家条目下的
data字段是一个按时间顺序排列的列表,每个元素对应某一天的统计值,不是单个字典,所以取新增病例的时候需要先定位到列表里对应日期的元素,再读取new_cases键。
举个实际例子,如果要取阿富汗最早统计日的新增病例,写法是:
# 直接用json.load返回的原始字典操作,不要用dumps转成的字符串 afg_first_new_cases = data['AFG']['data'][0]['new_cases']
如果要取阿富汗最新一天的新增病例,直接取列表最后一个元素即可:
afg_latest_new_cases = data['AFG']['data'][-1]['new_cases']
2. 全量遍历所有国家的优化实现
完全不需要手动逐个敲国家代码——这个JSON的顶层字典,所有的键就是内置的国家/地区识别码,直接遍历字典的所有键值对,就能拿到全量国家的信息。以下是适配初学者的参考代码,全程用Python原生功能,不需要安装任何第三方工具:
import json # 用with上下文管理器打开文件,不需要手动写f.close(),避免文件读取异常时句柄没释放 with open('covidData.json', 'r', encoding='utf-8') as f: raw_data = json.load(f) # 遍历所有国家的条目 for country_code, country_info in raw_data.items(): # 跳过没有实际日度统计的聚合条目(比如全球汇总、各大洲汇总) if 'data' not in country_info: continue # 拿到国家全称,避免输出只有看不懂的字母代码 country_name = country_info['location'] # 遍历当前国家所有的日度统计记录 for daily_record in country_info['data']: # 跳过缺失新增病例值的日期,避免打印无意义的None if 'new_cases' in daily_record: print(f"国家:{country_name} | 日期:{daily_record['date']} | 当日新增病例:{daily_record['new_cases']}")
针对初学者的小提示
- 用
with语句处理文件是Python的标准写法,比手动open、close更稳妥,就算读取过程中报错也会自动关闭文件 - 官方公开统计数据里部分日期、部分指标是缺测的,直接取值会打印无意义的
None,加个键存在性判断就能过滤掉 - 如果你不想打印全量历史数据,只需要看每个国家最新的统计值,只要把内层的日期循环删掉,直接取
country_info['data'][-1]这最后一条记录就行,能大幅减少输出量
内容的提问来源于stack exchange,提问作者Oleh Oshchepkov
相关产品推荐
相关产品推荐

