如何用Python获取并排序JSON数据?遍历仅输出单条数据求助
解决Python获取JSON数据、遍历显示及排序的问题
嘿,我来帮你理清这几个问题:
首先,你觉得遍历的时候“仅能输出单条数据”,其实是个视觉错觉——你的print语句把所有字段直接拼接在一起,没有换行或者空格分隔,导致所有站点的内容都挤成了一大串,看起来像是只有一条结果。咱们先把这个问题解决掉,再来说排序的事儿。
第一步:修正JSON解析与遍历输出
首先,绝对不要用eval()来解析JSON——这玩意儿会执行字符串里的任意代码,有安全风险,而且遇到复杂JSON格式很容易翻车。Python自带的json.loads()才是处理JSON的标准姿势,安全又可靠。
然后,修改你的print语句,给每条数据加上换行和字段分隔,让输出清晰可读:
import json import requests url1 = 'https://opendata.epa.gov.tw/ws/Data/ATM00625/?$format=json' html = requests.get(url1) html.encoding = html.apparent_encoding # 用安全的json.loads解析JSON,替代eval jsondata = json.loads(html.text) # 遍历每条数据,让每条结果单独一行,字段间用空格分隔 for site in jsondata: sitename = site["Site"] countyname = site["county"] pm25 = site["PM25"] date = site["DataCreationDate"] unit = site["ItemUnit"] # 使用f-string让代码更简洁,同时添加分隔符和换行 print(f"SITE:{sitename} CITY:{countyname} PM25:{pm25} DATE:{date} UNIT:{unit}")
运行这段代码,你就能看到每条站点数据单独一行显示了,不会再混在一起。
第二步:对JSON数据进行排序
接下来是排序需求,根据不同的排序维度,我们可以用Python的sorted()函数来实现,它支持通过key参数指定排序依据。
按站点名称(Site)排序
如果想按站点名称的拼音/字母顺序升序排序,代码如下:
# 按Site字段升序排序 sorted_by_site = sorted(jsondata, key=lambda x: x["Site"]) # 遍历排序后的结果 for site in sorted_by_site: print(f"SITE:{site['Site']} CITY:{site['county']} PM25:{site['PM25']} DATE:{site['DataCreationDate']} UNIT:{site['ItemUnit']}")
按PM25数值排序
注意PM25字段可能存在空字符串或者非数字的情况,所以我们需要先处理这些异常值,避免转换时出错:
# 定义一个函数,用来获取PM25的数值(空值或非数字返回-1,放到排序最后) def get_pm25_value(item): try: # 尝试转换为浮点数,空字符串则返回-1 return float(item["PM25"]) if item["PM25"].strip() else -1 except ValueError: # 遇到非数字内容也返回-1 return -1 # 按PM25数值降序排序(数值大的在前) sorted_by_pm25 = sorted(jsondata, key=get_pm25_value, reverse=True) # 遍历排序后的结果 for site in sorted_by_pm25: print(f"SITE:{site['Site']} CITY:{site['county']} PM25:{site['PM25']} DATE:{site['DataCreationDate']} UNIT:{site['ItemUnit']}")
总结一下
- 解析JSON用
json.loads(),别用eval(),安全第一 - 打印结果时添加换行和分隔符,避免视觉混淆
- 排序用
sorted()函数,通过key指定排序字段,记得处理可能的异常值(比如空的PM25)
内容的提问来源于stack exchange,提问作者George Mesis
相关产品推荐
相关产品推荐

