查看全课大纲(第 43 / 51 节)
  1. 1.为什么人人都该学点编程?
  2. 2.计算机与程序设计:你的电脑到底在“想”什么?
  3. 3.Python 这门语言,到底有什么魔力?
  4. 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
  5. 5.如何安装一个更强大的代码编辑器?
  6. 6.汇率兑换1.0:你的第一个“钱生钱”小程序
  7. 7.你的第一行代码,藏着哪些秘密?
  8. 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
  9. 9.汇率兑换程序,如何让它“聪明”地判断币种?
  10. 10.汇率兑换程序能一直运行,直到我喊停吗?
  11. 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
  12. 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
  13. 13.怎么用 Python 画一个会动的五角星?
  14. 14.如何让程序自动画出不同大小的五角星?
  15. 15.函数自己调用自己,会发生什么?
  16. 16.用递归画出神奇的分形树
  17. 17.Python 怎么计算你一天躺着不动能消耗多少热量?
  18. 18.如何让程序“活”起来,持续为你服务?
  19. 19.如何让 BMR 计算器更“聪明”?
  20. 20.当程序遇到“不按套路出牌”的用户怎么办?
  21. 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
  22. 22.如何用列表记录每一周的存款?
  23. 23.如何让程序自己数数?—— 用 for 循环解放你的双手
  24. 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
  25. 25.52周存钱挑战:怎么根据日期自动查存款?
  26. 26.Python 怎么判断一年中的第几天?
  27. 27.列表 vs 元组:哪个更适合存储月份天数?
  28. 28.用集合给月份分个队,换个思路算天数
  29. 29.把月份和天数“锁”在一起:用字典给数据配个对
  30. 30.Python 怎么判断密码强弱?
  31. 31.Python 怎么给密码设置“防沉迷”系统?
  32. 32.Python 怎么把密码保存到文件里?
  33. 33.Python 怎么读取文件里的密码?
  34. 34.Python 怎么把密码检查工具“打包”起来?
  35. 35.Python 怎么把文件操作也“打包”起来?
  36. 36.计算机怎么“扔骰子”?——用Python模拟随机事件
  37. 37.如何用 Python 模拟掷两个骰子?
  38. 38.怎么用 Python 把骰子轨迹画出来?
  39. 39.骰子点数分布长啥样?用直方图一眼看穿!
  40. 40.用科学计算库让骰子程序“起飞”
  41. 41.空气质量指数怎么算?手把手教你写一个AQI计算器
  42. 42.空气质量指数计算:从零开始,让程序看懂空气
  43. 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
  44. 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
  45. 45.Python 怎么让程序自己判断文件类型?
  46. 46.如何让程序自己上网查空气质量?
  47. 47.用美味的汤来解析网页:Beautiful Soup 入门
  48. 48.如何让爬虫自动抓取全国所有城市的空气质量?
  49. 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
  50. 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
  51. 51.空气质量数据怎么“洗”干净,还能画成图?

如何读取空气质量数据文件并找出空气质量最好的五个监测点?

约 19 分钟

小象实战讲义 · Python 入门:8 个小项目边玩边学

上一节我们学会了如何计算空气质量指数(AQI),但现实中的数据往往不是我们手动输入的,而是已经整理好的文件。想象一下,环保部门每天都会收集全国各个监测点的空气质量数据,这些数据通常保存在文件里。如果我们想找出北京空气质量最好的五个监测点,难道要手动一个个计算吗?当然不用!这一节,我们就来学习如何读取数据文件,让程序自动帮我们找出空气质量最好的五个监测点。

💡 核心导读

  • 本节新增:只学一件事——如何读取和操作 JSON 格式的数据文件
  • 你会学到:什么是 JSON 文件,它为什么在互联网上这么流行
  • 你会做到:读取真实的空气质量数据文件,按 AQI 值排序,找出空气质量最好的五个监测点
  • 有趣之处:你的程序现在能“读懂”真实世界的数据文件了,就像侦探在数据海洋里找出线索一样!

数据文件:程序与真实世界的桥梁

在之前的项目中,我们的数据都是手动输入或者程序生成的。但在真实工作中,数据通常保存在文件里。空气质量数据也不例外——环保部门会把各个监测点的数据整理成文件,方便分析和共享。

今天我们要处理的数据文件格式叫做 JSON(发音像“杰森”)。你可能在别的地方听过这个名字,因为它实在是太常见了!从天气预报 API 到社交媒体的数据,很多都使用 JSON 格式。

为什么是 JSON?

JSON 文件有几个特别适合我们的优点:

  1. 人类可读:用记事本就能打开看,里面的数据一目了然
  2. 结构清晰:能表达复杂的数据关系,比如列表、字典嵌套
  3. 通用性强:几乎所有编程语言都能处理 JSON,是数据交换的“普通话”

让我们先看看一个真实的空气质量 JSON 文件长什么样:

[
  {
    "aqi": 47,
    "area": "北京",
    "position_name": "万寿西宫",
    "time_point": "2017-07-29"
  },
  {
    "aqi": 63,
    "area": "北京", 
    "position_name": "定陵",
    "time_point": "2017-07-29"
  }
]

是不是很像我们之前学过的 Python 字典和列表?没错!JSON 的基本规则就是:

  • 花括号 {} 表示一个对象(在 Python 里就是字典)
  • 方括号 [] 表示一个数组(在 Python 里就是列表)
  • 键值对 用冒号分隔,比如 "aqi": 47
  • 多个键值对 用逗号分隔

这个文件里有两个监测点的数据,每个监测点都有 AQI 值、地区、监测点名称和时间点。整个文件就是一个列表,列表里有两个字典。

读取 JSON 文件:Python 的“翻译官”

Python 有一个内置的 json 库,专门负责处理 JSON 数据。它就像个翻译官,能把 JSON 文件“翻译”成 Python 能理解的数据结构。

两个关键过程

json 库主要处理两个方向的数据转换:

  1. 解码(decoding):从 JSON 文件 → Python 数据类型

    • load():从文件读取 JSON 数据
    • loads():从字符串读取 JSON 数据
  2. 编码(encoding):从 Python 数据类型 → JSON 文件

    • dump():把数据写入 JSON 文件
    • dumps():把数据转换成 JSON 字符串

今天我们先学第一个方向:读取 JSON 文件。

实战:读取空气质量数据

让我们写一个完整的程序,读取 JSON 文件并找出空气质量最好的五个监测点:

import json
import os

# 本节需要 beijing_aqi.json(课程 resources 附件提供);为便于单独运行,先用示例数据建一份
with open('beijing_aqi.json', 'w', encoding='utf-8') as f:   # 示例数据:每次运行都重建,保证输出一致
    f.write('''[
  {"aqi": 44, "area": "北京", "position_name": "天坛", "time_point": "2017-07-29"},
  {"aqi": 46, "area": "北京", "position_name": "农展馆", "time_point": "2017-07-29"},
  {"aqi": 47, "area": "北京", "position_name": "万寿西宫", "time_point": "2017-07-29"},
  {"aqi": 48, "area": "北京", "position_name": "古城", "time_point": "2017-07-29"},
  {"aqi": 48, "area": "北京", "position_name": "海淀区万柳", "time_point": "2017-07-29"}
]''')

def process_json_file(filepath):
    """
    读取并解析 JSON 文件
    返回解析后的 Python 列表
    """
    # 1. 打开文件(注意指定编码为 utf-8,避免中文乱码)
    f = open(filepath, mode='r', encoding='utf-8')
    
    # 2. 用 json.load() 读取文件内容,自动转换成 Python 列表
    city_list = json.load(f)
    
    # 3. 关闭文件(好习惯!)
    f.close()
    
    return city_list

def main():
    """
    主函数:整个程序的入口
    """
    # 原程序这里用 input() 让用户输入文件名
    # 为了让你能直接运行,这里先用固定值
    filepath = 'beijing_aqi.json'  # 你可以改成 'shanghai_aqi.json' 试试
    
    # 读取 JSON 文件
    city_list = process_json_file(filepath)
    
    # 按 AQI 值从小到大排序(AQI 越小空气质量越好)
    # 使用 lambda 函数告诉 sort:按每个城市的 'aqi' 字段排序
    city_list.sort(key=lambda city: city['aqi'])
    
    # 取前5个(空气质量最好的5个监测点)
    top5_list = city_list[:5]
    
    # 把结果保存到新的 JSON 文件
    output_file = open('top5_aqi.json', mode='w', encoding='utf-8')
    json.dump(top5_list, output_file, ensure_ascii=False)  # ensure_ascii=False 确保中文正常显示
    output_file.close()
    
    # 同时在控制台输出结果
    print("空气质量最好的5个监测点:")
    for i, city in enumerate(top5_list, 1):
        print(f"{i}. {city['position_name']}: AQI = {city['aqi']}")

# 直接运行主函数
main()
空气质量最好的5个监测点:
1. 天坛: AQI = 44
2. 农展馆: AQI = 46
3. 万寿西宫: AQI = 47
4. 古城: AQI = 48
5. 海淀区万柳: AQI = 48

代码解析:几个关键点

1. 文件编码很重要

def process_json_file(filepath):
    """
    读取并解析 JSON 文件
    返回解析后的 Python 列表
    """
    # 1. 打开文件(注意指定编码为 utf-8,避免中文乱码)
    f = open(filepath, mode='r', encoding='utf-8')

    # 2. 用 json.load() 读取文件内容,自动转换成 Python 列表
    city_list = json.load(f)

    # 3. 关闭文件(好习惯!)
    f.close()

    return city_list

中文文件一定要指定 encoding='utf-8',否则会出现乱码。你可以把 utf-8 想象成中文的“标准发音”,告诉 Python 如何正确读出中文字符。

2. 排序的魔法:lambda 函数

# 在 main() 中,排序只需要这一行(city_list 是上面读取到的列表):
city_list.sort(key=lambda city: city['aqi'])  # 按每个元素的 aqi 字段升序排列

这行代码做了三件事:

  • city_list.sort():对列表排序
  • key=:指定按什么规则排序
  • lambda city: city['aqi']:一个匿名函数,输入是列表中的每个元素(我们叫它 city),输出是这个元素的 aqi 值

lambda 是希腊字母 λ,在编程中表示“匿名函数”——没有名字、只用一次的小函数。你可以把它理解成一个临时的“提取器”:从每个监测点数据中提取出 AQI 值,然后按这个值排序。

3. 切片取前五

# 排好序后,用切片取前 5 个(city_list 已按 AQI 升序):
top5_list = city_list[:5]

还记得列表切片吗?[:5] 表示“从开始到第5个元素(不包含第5个)”。因为我们已经按 AQI 从小到大排好序,所以前5个就是空气质量最好的5个。

看看生成的结果文件

程序运行后,会生成一个 top5_aqi.json 文件。用记事本打开看看:

[
  {"aqi": 44, "area": "北京", "position_name": "天坛", "time_point": "2017-07-29"},
  {"aqi": 46, "area": "北京", "position_name": "农展馆", "time_point": "2017-07-29"},
  {"aqi": 47, "area": "北京", "position_name": "万寿西宫", "time_point": "2017-07-29"},
  {"aqi": 48, "area": "北京", "position_name": "古城", "time_point": "2017-07-29"},
  {"aqi": 48, "area": "北京", "position_name": "海淀区万柳", "time_point": "2017-07-29"}
]

这就是 JSON 格式的数据!程序不仅帮我们找到了空气质量最好的监测点,还把结果保存成了标准格式,方便分享给其他人或其他程序使用。

试试上海的数据

我们还有一个上海的数据文件。只需要改一行代码:

# 把北京改成上海
filepath = 'shanghai_aqi.json'  # 修改这一行(shanghai_aqi.json 在课程资源附件中)

重新运行程序,输出的监测点名称和排名就全部换成上海的数据了——同一个程序,换一个文件名就能处理另一个城市,这也是把读取逻辑封装成函数的好处。

提示:北京示例数据已内置在上面的完整程序中(首次运行自动生成);上海的数据请使用课程资源附件里的 shanghai_aqi.json。

JSON 在真实世界的应用

你可能会想:“JSON 看起来就是些括号和引号,有什么用呢?”实际上,JSON 是互联网的“数据普通话”:

  • 网站 API:当你用手机 App 查天气时,服务器返回的数据就是 JSON 格式
  • 配置文件:很多软件的设置都保存在 JSON 文件里
  • 数据交换:不同系统之间传递数据,JSON 是最常用的格式之一

学会处理 JSON,你就掌握了与大多数网络服务“对话”的基本技能。下次你看到手机 App 显示“正在加载数据…”,很可能就是在下载和解析 JSON 数据呢!

📝 动手练一练

  1. 扩展练习:现在的程序只输出前5名,如果我想看前10名怎么办?如果我想看空气质量最差的5个监测点呢?
👉 点击查看参考答案

思路:

  • 看前10名:把切片改成 [:10]
  • 看最差的5个:先按 AQI 从大到小排序(降序),再取前5个

关键代码修改(在读取并排序之后):

# 看前10名:把切片从 [:5] 改成 [:10]
top10_list = city_list[:10]

# 看最差的5个:降序排序后再取前5个
city_list.sort(key=lambda city: city['aqi'], reverse=True)  # reverse=True 表示降序
worst5_list = city_list[:5]

完整修改后的主函数部分:

def main():
    filepath = 'beijing_aqi.json'
    city_list = process_json_file(filepath)  # process_json_file 沿用上方定义

    # 空气质量最好的10个
    city_list.sort(key=lambda city: city['aqi'])
    top10_list = city_list[:10]
    print("空气质量最好的10个监测点:")
    for i, city in enumerate(top10_list, 1):
        print(f"{i}. {city['position_name']}: AQI = {city['aqi']}")

    print("\n" + "="*50 + "\n")

    # 空气质量最差的5个
    city_list.sort(key=lambda city: city['aqi'], reverse=True)
    worst5_list = city_list[:5]
    print("空气质量最差的5个监测点:")
    for i, city in enumerate(worst5_list, 1):
        print(f"{i}. {city['position_name']}: AQI = {city['aqi']}")

把这个 main() 与上方的 process_json_file、示例数据放在同一个文件里运行,就能看到前10名和最差5名两份榜单。

  1. 数据探索:如果我想知道北京那天所有监测点的平均 AQI 是多少,该怎么计算?
👉 点击查看参考答案

思路:

  1. 读取所有监测点的数据
  2. 提取每个监测点的 AQI 值
  3. 计算这些值的平均数

关键代码:

def calculate_average_aqi(city_list):
    """计算所有监测点的平均 AQI"""
    total_aqi = 0
    count = 0

    for city in city_list:
        total_aqi += city['aqi']
        count += 1

    return total_aqi / count if count > 0 else 0

在主函数里读取数据后调用它:

# city_list 是 process_json_file 读取到的列表:
average_aqi = calculate_average_aqi(city_list)
print(f"北京所有监测点的平均 AQI: {average_aqi:.1f}")

简化版(用列表推导式):

# 先把每个监测点的 aqi 值提取成一个新列表,再求平均:
aqi_values = [city['aqi'] for city in city_list]
average_aqi = sum(aqi_values) / len(aqi_values)

列表推导式一行就完成了“遍历 + 提取”,效果和上面的循环累加完全等价。

  1. 文件操作:现在的程序每次运行都会覆盖 top5_aqi.json 文件。如果我想把北京和上海的结果保存到不同的文件里,该怎么修改?
👉 点击查看参考答案

思路:根据输入的文件名生成不同的输出文件名

关键代码修改(替换 main() 里保存结果的那几行;process_json_file 沿用上方定义):

def main():
    # 原程序用 input(),这里用固定值演示
    filepath = 'beijing_aqi.json'

    city_list = process_json_file(filepath)
    city_list.sort(key=lambda city: city['aqi'])
    top5_list = city_list[:5]

    # 根据输入文件名生成输出文件名
    # 例如:beijing_aqi.json → beijing_aqi_top5.json
    import os
    filename = os.path.basename(filepath)  # 获取文件名,如 'beijing_aqi.json'
    name_without_ext = os.path.splitext(filename)[0]  # 去掉扩展名,得到 'beijing_aqi'
    output_filename = f"{name_without_ext}_top5.json"  # 生成 'beijing_aqi_top5.json'

    # 保存到新文件
    output_file = open(output_filename, mode='w', encoding='utf-8')
    json.dump(top5_list, output_file, ensure_ascii=False)
    output_file.close()

    print(f"结果已保存到: {output_filename}")

这样,处理北京数据会生成 beijing_aqi_top5.json,处理上海数据会生成 shanghai_aqi_top5.json,不会互相覆盖。

本章小结

这一节我们迈出了重要的一步:从手动输入数据,升级到读取真实的数据文件。你现在已经能够:

  • ✅ 理解 JSON 文件的基本结构(列表、字典、键值对)
  • ✅ 使用 Python 的 json 库读取 JSON 文件
  • ✅ 对复杂数据进行排序(用 lambda 函数指定排序规则)
  • ✅ 把处理结果保存到新的文件中

最重要的是,你的程序现在能处理真实世界的数据了!这不再是玩具示例,而是真正有用的数据分析工具。

📋 行动清单

学完这一节,你可以:

  • 运行今天的程序,分别处理北京和上海的空气质量数据,看看哪个城市那天的空气质量更好
  • 修改程序,找出空气质量最差的3个监测点(提示:降序排序)
  • 探索数据:计算一下北京所有监测点 AQI 的平均值、最大值、最小值
  • 实际应用:如果你所在的城市有公开的空气质量数据(通常是 JSON 或 CSV 格式),试着用今天的程序分析一下

下一节,我们将学习另一种常见的数据格式——CSV(逗号分隔值),它看起来像 Excel 表格,在商业和科学领域非常常用。到时候你的程序就能处理更多类型的数据文件了!

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第9章代码包:空气质量指数计算(含全部版本 10 个 .py)
    ZIP · 64KB
    下载
  • 数据集:aqi.csv(各城市 AQI 长表)
    772B
    下载
  • 数据集:beijing_aqi.json(北京监测点)
    3KB
    下载
  • 数据集:bottom10_aqi.csv(空气质量最差 10 城)
    412B
    下载
  • 数据集:china_city_aqi.csv(全国城市 AQI)
    13KB
    下载
  • 数据集:shanghai_aqi.json(上海监测点)
    3KB
    下载
  • 数据集:top10_aqi.csv(空气质量最好 10 城)
    372B
    下载
  • 数据集:top5_aqi.json(空气质量最好 5 城)
    1007B
    下载
看图文没弄懂?展开看本节视频讲解(约 19 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)