📑 查看全课大纲(第 9 / 101 节)
- 1.数据分析基本概念
- 2.学习数据分析的一般路线
- 3.数据分析的流程
- 4.数据类型
- 5.环境部署(1)
- 6.环境部署(2)
- 7.课程介绍
- 8.TXT文件操作
- 9.JSON文件操作
- 10.CSV文件操作
- 11.Excel文件操作
- 12.数据库及SQL常用语法
- 13.数据库基本操作
- 14.数据库多表连接
- 15.实战:欧洲职业足球数据库分析
- 16.爬虫简介
- 17.URL管理模块
- 18.网页下载模块
- 19.网页解析模块(1)
- 20.网页解析模块(2)
- 21.Scrapy简介
- 22.Scrapy使用步骤(1)
- 23.Scrapy使用步骤(2)
- 24.Scrapy使用步骤(3)
- 25.Scrapy使用步骤(4)
- 26.实战:获取国内城市空气质量指数数据
- 27.NumPy和SciPy介绍
- 28.多维数组
- 29.多维数组操作
- 30.NumPy的常用方法
- 31.向量化介绍
- 32.向量化及通用函数
- 33.实战:2016美国大选分析
- 34.数据结构-Series
- 35.数据结构-DataFrame
- 36.数据结构-Index
- 37.Series的索引操作
- 38.DataFrame的索引操作
- 39.索引操作总结
- 40.运算与对齐
- 41.函数应用操作(1) -- map
- 42.函数应用操作 (2) -- apply applymap
- 43.文件读写操作
- 44.排序操作
- 45.数据清洗--处理缺失数据
- 46.数据清洗--处理重复数据
- 47.数据清洗--替换数据
- 48.常用统计方法(1) -- describe quantile
- 49.常用统计方法(2) -- sum mean median count
- 50.常用统计方法(3) -- max min idxmax idxmin
- 51.常用统计方法(4) -- mad var std cumsum
- 52.实战:全球食品数据分析
- 53.层级索引
- 54.分组与聚合介绍
- 55.分组操作(1) -- GroupBy对象及常用聚合操作
- 56.分组操作(2) -- 自定义分组及聚合操作
- 57.透视表介绍
- 58.透视表操作
- 59.数据规整(1) -- 数据合并concat
- 60.数据规整(2) -- 数据连接merge
- 61.数据重构(3) -- 数据重构stack unstack
- 62.实战:互联网电影资料库分析
- 63.探索性数据分析EDA介绍
- 64.EDA的目的
- 65.EDA常用工具
- 66.Matplotlib绘图基本介绍
- 67.Matplotlib画布
- 68.散点图和柱状图的绘制
- 69.直方图的绘制
- 70.矩阵绘图
- 71.子图的使用
- 72.Matplotlib颜色、标记、线型
- 73.Matplotlib坐标刻度、标签、图例、标题
- 74.Seaborn介绍
- 75.数据集分布可视化(1) -- 单变量分布、双变量分布
- 76.数据集分布可视化(2) -- 变量关系可视化
- 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
- 78.交互式数据可视化工具Bokeh介绍
- 79.Bokeh绘制散点图、柱状图、盒子图、弦图
- 80.Bokeh绘制常用图形元素
- 81.D绘图 -- mplot3d
- 82.D曲线可视化
- 83.D散点图可视化
- 84.D柱状图可视化
- 85.Pandas绘图
- 86.实战:Lending Club借贷数据探索性分析及可视化
- 87.机器学习介绍及应用场景
- 88.机器学习建模介绍 (1) -- 分类
- 89.机器学习建模介绍 (2) -- 回归
- 90.机器学习建模介绍 (3) -- 聚类
- 91.机器学习分类
- 92.机器学习工具scikit-learn
- 93.使用scikit-learn的流程
- 94.数据集准备及划分
- 95.模型选择
- 96.数据预处理及特征工程
- 97.过拟合与欠拟合
- 98.模型调参介绍
- 99.模型调参方法
- 100.模型测试及评价
- 101.实战:通过移动设备行为数据预测性别和年龄
JSON文件操作
约 14 分钟
Python 半结构化数据处理:JSON 文件解析与序列化实战
小象实战讲义 · Python数据分析实战
在现代互联网与数据分析生态中,JSON(JavaScript Object Notation)已成为跨语言、跨平台数据交换与网络 API 通信的事实标准。无论是从第三方开放平台(如天气预报、地图服务、电商商品接口)调用 RESTful API 返回的响应报文,还是存储复杂的层级配置与用户画像,JSON 格式都扮演着核心角色。掌握 Python 内置的 json 模块,熟练进行序列化(Serialization)与反序列化(Deserialization),是数据分析师必备的数据解析硬技能。
💡 核心导读
- JSON 数据模型认知:理解对象(Object
{})与数组(Array[])的树状嵌套机理。 - Python 与 JSON 类型映射表:掌握
dict、list、str、int/float、bool以及None ➔ null的互转规则。 - 四大核心 API 精析:彻底厘清
json.load()/json.loads()与json.dump()/json.dumps()的功能边界。 - 中文与美化参数详解:掌握
ensure_ascii=False(防中文转义 Unicode)与indent=2(层级缩进美化)的实战技巧。 - 嵌套 API 响应解析实战:通过 Python 代码实现多层嵌套天气数据与商品评价的提取与汇总。
1. 认识 JSON:轻量级数据交换格式
JSON 是一种纯文本、人类可读且易于机器解析的轻量级半结构化数据交换格式。它主要由两种核心结构组合嵌套而成:
┌─────────────────────────────────────────────────────────────┐
│ JSON 的两大基础核心结构 │
├───────────────────────────────┬─────────────────────────────┤
│ 1. 键值对对象 (Object) `{}` │ 2. 有序数组 (Array) `[]` │
│ {"name": "小象", "age": 5} │ ["Python", "Pandas", "SQL"] │
└───────────────────────────────┴─────────────────────────────┘Python 与 JSON 数据类型对照表
| Python 数据类型 | JSON 数据类型 | 转换示例 |
|---|---|---|
dict (字典) | object (对象) | {"key": "value"} ⟷ {"key": "value"} |
list, tuple (列表/元组) | array (数组) | [1, 2, 3] ⟷ [1, 2, 3] |
str (字符串) | string (字符串) | "hello" ⟷ "hello" (JSON 必须双引号) |
int, float (整数/浮点数) | number (数值) | 42, 3.14 ⟷ 42, 3.14 |
True / False (布尔值) | true / false (布尔值) | True ⟷ true (小写) |
None (空值) | null (空值) | None ⟷ null |
2. 四大核心 API 矩阵与应用场景
Python 内置的 json 模块提供了四种操作函数,名称中的 s 代表字符串(String),无 s 则代表文件流(File-like Stream):
┌───────────────────────────────┐
│ Python 内置 json 模块 API │
└───────────────┬───────────────┘
┌───────────────────────┴───────────────────────┐
▼ (反序列化 / 解析) ▼ (序列化 / 导出)
[JSON ➔ Python 对象] [Python 对象 ➔ JSON]
• json.loads(str_data) 从字符串解析 • json.dumps(obj) 导出为字符串
• json.load(file_obj) 从文件流解析 • json.dump(obj, f) 写入到文件流序列化输出的两大关键参数:
ensure_ascii=False:默认情况下json.dumps()会将所有非 ASCII 字符(包括中文字符)转义为\u4e2d\u6587形式。传入ensure_ascii=False可以确保中文字符以可读的原样输出;indent=4(或indent=2):指定缩进空格数,将单行密集的 JSON 转换为易读的多行美化格式。
3. Python 代码实战:嵌套 JSON 数据的解析、清洗与导出
下面我们通过一段 Python 脚本,模拟从第三方气象服务接口获取的复杂多层嵌套 JSON 报文,演示如何精确提取各城市的天气、温度及空气质量指标,并清洗后导出为本地 JSON 报表。
# 示例 1:使用 json.loads() 解析多层嵌套 JSON 字符串
import json
import os
# 模拟 Web API 返回的多城市气象数据 JSON 字符串
mock_api_response = """
{
"status": 200,
"update_time": "2026-08-22 10:00:00",
"region_data": [
{
"city": "北京",
"weather": {"temp": 28.5, "humidity": 45, "condition": "晴"},
"air_quality": {"aqi": 42, "level": "优"}
},
{
"city": "上海",
"weather": {"temp": 32.0, "humidity": 75, "condition": "多云"},
"air_quality": {"aqi": 58, "level": "良"}
},
{
"city": "广州",
"weather": {"temp": 34.2, "humidity": 80, "condition": "雷阵雨"},
"air_quality": {"aqi": 35, "level": "优"}
}
]
}
"""
# 1. 将 JSON 字符串反序列化为 Python 字典
data = json.loads(mock_api_response)
print("=== 解析 API 响应元信息 ===")
print(f"状态码: {data['status']} | 更新时间: {data['update_time']}")
print(f"覆盖城市数量: {len(data['region_data'])} 个\n")
# 2. 遍历提取嵌套字段并构建扁平化结构
flattened_records = []
for item in data["region_data"]:
city_name = item["city"]
temp = item["weather"]["temp"]
cond = item["weather"]["condition"]
aqi = item["air_quality"]["aqi"]
level = item["air_quality"]["level"]
flattened_records.append({
"city": city_name,
"temperature": temp,
"condition": cond,
"aqi": aqi,
"air_level": level
})
print(f"• 城市: {city_name:<4} | 温度: {temp:>4.1f}℃ ({cond}) | AQI: {aqi} [{level}]")接下来,我们计算这些城市的平均气温,并将加工清洗后的结构化数据通过 json.dump() 写入本地文件:
# 示例 2:使用 json.dump() 将加工后的分析结果美化写入本地文件
avg_temperature = sum(r["temperature"] for r in flattened_records) / len(flattened_records)
out_json_path = "city_weather_summary.json"
summary_report = {
"report_title": "多城市气象数据分析简报",
"average_temperature": round(avg_temperature, 2),
"city_count": len(flattened_records),
"city_details": flattened_records
}
# 将 Python 字典序列化并美化写入本地 JSON 文件
with open(out_json_path, "w", encoding="utf-8") as f:
json.dump(summary_report, f, ensure_ascii=False, indent=2)
print(f"\n✅ 已成功将分析简报持久化至本地: {out_json_path}")
# 3. 使用 json.load() 重新回读文件进行完整性校验
with open(out_json_path, "r", encoding="utf-8") as f:
reloaded_data = json.load(f)
print(f"回读检验: 报表标题为【{reloaded_data['report_title']}】,平均气温 {reloaded_data['average_temperature']}℃")
# 清理临时文件
if os.path.exists(out_json_path):
os.remove(out_json_path)📝 动手练一练
语法辨析题:小李在编写爬虫脚本时,得到了一个包含中文字符的字典
user_info = {"name": "张三", "city": "深圳"}。当他调用json_str = json.dumps(user_info)后打印输出,发现结果变成了{"name": "\u5f20\u4e09", "city": "\u6df1\u5733"}。请问这是为什么?应该如何修改代码让其正常显示中文字符?👉 点击查看参考答案
参考答案:
json.dumps()默认参数为ensure_ascii=True,会将所有非 ASCII 字符(如中文)转义为 Unicode 转义序列(\uXXXX)。 正确修改方式:显式设置参数ensure_ascii=False,即:json.dumps(user_info, ensure_ascii=False)。编程练习:假设你有一个本地配置字典
app_config = {"version": "2.5.0", "debug_mode": False, "allowed_ips": ["127.0.0.1", "192.168.1.1"]}。请编写 Python 脚本,将其以缩进为 4 个空格的格式写入名为config.json的文件中,并随后用json.load()读取并打印出debug_mode的布尔值。👉 点击查看参考答案
参考答案:
import json import os app_config = { "version": "2.5.0", "debug_mode": False, "allowed_ips": ["127.0.0.1", "192.168.1.1"] } cfg_file = "config.json" # 写入配置 with open(cfg_file, "w", encoding="utf-8") as f: json.dump(app_config, f, indent=4) # 读取并校验 with open(cfg_file, "r", encoding="utf-8") as f: loaded_cfg = json.load(f) print(f"读取配置成功 -> Debug 模式开启状态: {loaded_cfg['debug_mode']}") if os.path.exists(cfg_file): os.remove(cfg_file)
本章小结
在本节中,我们系统掌握了 JSON 半结构化数据的解析与存储:
- JSON 的两大核心支柱是对象(
dict)与数组(list),天然契合 Python 原生数据结构; - 牢记四大 API:内存字符串使用
loads/dumps,磁盘文件使用load/dump; - 输出中文数据时务必携带
ensure_ascii=False,美化呈现时配合indent参数。
📋 行动清单
- 尝试使用浏览器的“开发者工具(F12)➔ Network(网络)”,观察任意网页接口返回的 JSON 数据结构。
- 熟练掌握多层嵌套字典与列表的键值索引(如
data['items'][0]['price'])。
—— 小象教研组
- 本节课件:JSON文件操作(PDF · 298KB)下载
- 全套课件打包(第1-5章)(ZIP · 12.8MB)下载
- 全套课件打包(第6-8章)(ZIP · 15MB)下载
- 实战数据集:AppleStore 应用商城分析(ZIP · 329KB)下载
- 实战数据集:女性服装电商分析(ZIP · 2.8MB)下载
- Python 数据分析环境搭建指南(PDF · 2MB)下载
- Scrapy 安装教程(PDF · 12.7MB)下载
- 附加实战项目:AppleStore 应用商城数据分析(ZIP · 0.3MB · ipynb + CSV 数据)下载
- 附加实战项目:银行电话营销数据分析(ZIP · 0.4MB · ipynb + CSV 数据)下载
- 附加实战项目:女性服装电商评论数据分析(ZIP · 2.7MB · ipynb + CSV 数据)下载
- 附加实战项目:美国化学学会杂志数据分析(ZIP · 34.2MB · ipynb + SQLite 数据库)下载
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加课程顾问,免费获取网盘下载链接
微信扫码添加顾问