查看全课大纲(第 43 / 51 节)
- 1.为什么人人都该学点编程?
- 2.计算机与程序设计:你的电脑到底在“想”什么?
- 3.Python 这门语言,到底有什么魔力?
- 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
- 5.如何安装一个更强大的代码编辑器?
- 6.汇率兑换1.0:你的第一个“钱生钱”小程序
- 7.你的第一行代码,藏着哪些秘密?
- 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
- 9.汇率兑换程序,如何让它“聪明”地判断币种?
- 10.汇率兑换程序能一直运行,直到我喊停吗?
- 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
- 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
- 13.怎么用 Python 画一个会动的五角星?
- 14.如何让程序自动画出不同大小的五角星?
- 15.函数自己调用自己,会发生什么?
- 16.用递归画出神奇的分形树
- 17.Python 怎么计算你一天躺着不动能消耗多少热量?
- 18.如何让程序“活”起来,持续为你服务?
- 19.如何让 BMR 计算器更“聪明”?
- 20.当程序遇到“不按套路出牌”的用户怎么办?
- 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
- 22.如何用列表记录每一周的存款?
- 23.如何让程序自己数数?—— 用 for 循环解放你的双手
- 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
- 25.52周存钱挑战:怎么根据日期自动查存款?
- 26.Python 怎么判断一年中的第几天?
- 27.列表 vs 元组:哪个更适合存储月份天数?
- 28.用集合给月份分个队,换个思路算天数
- 29.把月份和天数“锁”在一起:用字典给数据配个对
- 30.Python 怎么判断密码强弱?
- 31.Python 怎么给密码设置“防沉迷”系统?
- 32.Python 怎么把密码保存到文件里?
- 33.Python 怎么读取文件里的密码?
- 34.Python 怎么把密码检查工具“打包”起来?
- 35.Python 怎么把文件操作也“打包”起来?
- 36.计算机怎么“扔骰子”?——用Python模拟随机事件
- 37.如何用 Python 模拟掷两个骰子?
- 38.怎么用 Python 把骰子轨迹画出来?
- 39.骰子点数分布长啥样?用直方图一眼看穿!
- 40.用科学计算库让骰子程序“起飞”
- 41.空气质量指数怎么算?手把手教你写一个AQI计算器
- 42.空气质量指数计算:从零开始,让程序看懂空气
- 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
- 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
- 45.Python 怎么让程序自己判断文件类型?
- 46.如何让程序自己上网查空气质量?
- 47.用美味的汤来解析网页:Beautiful Soup 入门
- 48.如何让爬虫自动抓取全国所有城市的空气质量?
- 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
- 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
- 51.空气质量数据怎么“洗”干净,还能画成图?
如何读取空气质量数据文件并找出空气质量最好的五个监测点?
约 19 分钟
小象实战讲义 · Python 入门:8 个小项目边玩边学
上一节我们学会了如何计算空气质量指数(AQI),但现实中的数据往往不是我们手动输入的,而是已经整理好的文件。想象一下,环保部门每天都会收集全国各个监测点的空气质量数据,这些数据通常保存在文件里。如果我们想找出北京空气质量最好的五个监测点,难道要手动一个个计算吗?当然不用!这一节,我们就来学习如何读取数据文件,让程序自动帮我们找出空气质量最好的五个监测点。
💡 核心导读
- 本节新增:只学一件事——如何读取和操作 JSON 格式的数据文件
- 你会学到:什么是 JSON 文件,它为什么在互联网上这么流行
- 你会做到:读取真实的空气质量数据文件,按 AQI 值排序,找出空气质量最好的五个监测点
- 有趣之处:你的程序现在能“读懂”真实世界的数据文件了,就像侦探在数据海洋里找出线索一样!
数据文件:程序与真实世界的桥梁
在之前的项目中,我们的数据都是手动输入或者程序生成的。但在真实工作中,数据通常保存在文件里。空气质量数据也不例外——环保部门会把各个监测点的数据整理成文件,方便分析和共享。
今天我们要处理的数据文件格式叫做 JSON(发音像“杰森”)。你可能在别的地方听过这个名字,因为它实在是太常见了!从天气预报 API 到社交媒体的数据,很多都使用 JSON 格式。
为什么是 JSON?
JSON 文件有几个特别适合我们的优点:
- 人类可读:用记事本就能打开看,里面的数据一目了然
- 结构清晰:能表达复杂的数据关系,比如列表、字典嵌套
- 通用性强:几乎所有编程语言都能处理 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 库主要处理两个方向的数据转换:
解码(decoding):从 JSON 文件 → Python 数据类型
load():从文件读取 JSON 数据loads():从字符串读取 JSON 数据
编码(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 数据呢!
📝 动手练一练
- 扩展练习:现在的程序只输出前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名两份榜单。
- 数据探索:如果我想知道北京那天所有监测点的平均 AQI 是多少,该怎么计算?
👉 点击查看参考答案
思路:
- 读取所有监测点的数据
- 提取每个监测点的 AQI 值
- 计算这些值的平均数
关键代码:
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)列表推导式一行就完成了“遍历 + 提取”,效果和上面的循环累加完全等价。
- 文件操作:现在的程序每次运行都会覆盖
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 表格,在商业和科学领域非常常用。到时候你的程序就能处理更多类型的数据文件了!
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。