查看全课大纲(第 9 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

JSON文件操作

约 14 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在数据分析工作中,我们经常会遇到一种名为JSON的数据格式。它广泛用于网络数据传输和配置文件存储。本节将带你认识JSON格式,并掌握使用Python内置的json模块进行数据读取和写入的核心方法。学完后,你将能够轻松处理来自API接口或本地存储的JSON数据。

💡 核心导读

  • 认识JSON:了解JSON(JavaScript Object Notation)作为一种轻量级数据交换格式的特性与两种基本结构(对象和数组)。
  • 读取JSON:掌握从本地文件读取(json.load())和从字符串变量读取(json.loads())两种方式。
  • 写入JSON:学会将Python数据结构写入文件(json.dump())和转换为字符串(json.dumps())。
  • 中文处理:学习在JSON读写中正确处理中文字符,避免乱码问题。

什么是JSON文件?

JSON,全称JavaScript Object Notation(JavaScript对象表示法),是一种轻量级的数据交换格式。它采用纯文本形式来表示带有结构性和层级关系的数据,非常适合在网络上进行传输,也常用于存储配置信息。

JSON数据主要包含两种结构:

  1. 对象(Object):由花括号 {} 表示,内部包含一系列“键(key)-值(value)”对,类似于Python中的字典。
  2. 数组(Array):由方括号 [] 表示,内部包含一系列有序的值,类似于Python中的列表。

这两种结构可以相互嵌套,从而表示非常复杂的数据信息。例如,对象中的值可以是数组,数组中的元素又可以是另一个对象。

{
  "firstName": "John",
  "lastName": "Smith",
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York"
  },
  "phoneNumber": [
    {"type": "home", "number": "123-456-7890"},
    {"type": "fax", "number": "987-654-3210"}
  ]
}

上图展示了一个典型的JSON对象,它描述了一个人的信息。其中包含了字符串、数值、嵌套的对象(address)以及包含对象的数组(phoneNumber)。

使用Python操作JSON

Python标准库中内置了json模块,无需额外安装,即可方便地进行JSON数据的解析和生成。其核心操作分为读取和写入两大类,每类又根据数据来源(文件或字符串)细分为两种方法。

读取JSON数据

1. 从文件读取:json.load() 当JSON数据存储在本地文件时,我们使用json.load()函数。它接收一个已打开的文件对象,并返回解析后的Python数据结构(通常是字典或列表)。

import json

# 示例:模拟从文件读取一个简单的JSON对象
# 假设文件内容为:{"name": "Amsterdam", "country": "Netherlands", "id": 11}
# 为了演示,我们直接在代码中构造一个文件对象
import io

# 模拟一个包含JSON内容的文件对象
json_file_content = '{"name": "Amsterdam", "country": "Netherlands", "id": 11}'
file_like_object = io.StringIO(json_file_content)

# 使用json.load()从文件对象加载
data_from_file = json.load(file_like_object)

print("数据类型:", type(data_from_file))
print("数据内容:", data_from_file)
print("城市名称:", data_from_file['name'])
数据类型: <class 'dict'>
数据内容: {'name': 'Amsterdam', 'country': 'Netherlands', 'id': 11}
城市名称: Amsterdam

2. 从字符串读取:json.loads() 如果JSON数据已经以字符串的形式存在于程序变量中(例如,从网络请求获得),则使用json.loads()函数(注意末尾的‘s’代表string)。

import json

# JSON格式的字符串
json_string = '{"firstName": "John", "lastName": "Simit", "phoneNumber": [{"type": "home", "number": "1234567"}, {"type": "work", "number": "7654321"}]}'

# 使用json.loads()解析字符串
parsed_data = json.loads(json_string)

print("解析后数据:", parsed_data)
print("数据类型:", type(parsed_data))
print("姓氏:", parsed_data['lastName'])
print("第一个电话号码类型:", parsed_data['phoneNumber'][0]['type'])
解析后数据: {'firstName': 'John', 'lastName': 'Simit', 'phoneNumber': [{'type': 'home', 'number': '1234567'}, {'type': 'work', 'number': '7654321'}]}
数据类型: <class 'dict'>
姓氏: Simit
第一个电话号码类型: home

写入JSON数据

1. 写入文件:json.dump() 将Python数据结构(如字典、列表)写入到JSON文件,使用json.dump(数据, 文件对象, ensure_ascii=False)。处理中文时,需要指定ensure_ascii=False来确保中文字符正常存储,而非被转义为Unicode码点。为便于在讲义中演示(不实际落盘),下面先用 json.dumps() 把同样的数据序列化为字符串,展示将要写入文件的内容(真实项目中,把该字符串换成 json.dump(book_list, f, ensure_ascii=False) 写入打开的文件即可):

import json

# 准备要写入的数据:一个字典列表,包含中文
book_list = [
    {'书名': '无声告白', '作者': '伍绮诗'},
    {'书名': '我不是潘金莲', '作者': '刘震云'},
    {'书名': '沉默的大多数', '作者': '王小波'}
]

# 使用json.dumps()先将其转换为字符串,以便查看和演示
json_string_output = json.dumps(book_list, ensure_ascii=False)
print("将要写入文件的JSON字符串:")
print(json_string_output)
将要写入文件的JSON字符串:
[{"书名": "无声告白", "作者": "伍绮诗"}, {"书名": "我不是潘金莲", "作者": "刘震云"}, {"书名": "沉默的大多数", "作者": "王小波"}]

2. 写入字符串变量:json.dumps() 如果需要将Python数据结构转换为JSON格式的字符串(例如,准备通过网络发送),则使用json.dumps()函数。

import json

# 使用与上例相同的数据
book_list = [
    {'书名': '无声告白', '作者': '伍绮诗'},
    {'书名': '我不是潘金莲', '作者': '刘震云'},
    {'书名': '沉默的大多数', '作者': '王小波'}
]

# 转换为JSON格式字符串
json_str = json.dumps(book_list, ensure_ascii=False)

print("转换后的字符串类型:", type(json_str))
print("字符串内容:", json_str)
转换后的字符串类型: <class 'str'>
字符串内容: [{"书名": "无声告白", "作者": "伍绮诗"}, {"书名": "我不是潘金莲", "作者": "刘震云"}, {"书名": "沉默的大多数", "作者": "王小波"}]

📝 动手练一练

  1. 概念辨析:json.load() 和 json.loads() 的主要区别是什么?json.dump() 和 json.dumps() 呢?
👉 点击查看参考答案
  • json.load() 用于从文件对象中读取并解析JSON数据。
  • json.loads() 用于从字符串中读取并解析JSON数据。
  • json.dump() 用于将Python对象序列化为JSON格式并写入文件对象。
  • json.dumps() 用于将Python对象序列化为JSON格式的字符串。

记忆口诀:带s的函数处理字符串(string),不带s的函数处理文件(file)。

  1. 动手实践:以下是一个Python列表:data = [{"product": "Laptop", "price": 999.99}, {"product": "Mouse", "price": 25.50}]。请编写代码,将其转换为一个格式美观(有缩进)的JSON字符串,并打印出来。
👉 点击查看参考答案
import json

data = [{"product": "Laptop", "price": 999.99}, {"product": "Mouse", "price": 25.50}]

# 使用indent参数美化输出
pretty_json_str = json.dumps(data, indent=2, ensure_ascii=False)
print(pretty_json_str)

输出结果:

[
  {
    "product": "Laptop",
    "price": 999.99
  },
  {
    "product": "Mouse",
    "price": 25.5
  }
]

本章小结

本节我们学习了JSON这一在数据交换领域举足轻重的格式。你不仅理解了其基于对象和数组的嵌套结构,更重要的是掌握了使用Python json模块进行读写操作的“两读两写”四大核心方法,并学会了如何处理其中的中文字符。

📋 行动清单

  • 尝试找一个在线的公开API(如天气API),查看其返回的JSON数据结构。
  • 在Python中,将一个包含你个人几条信息的字典(如姓名、城市、爱好列表)转换为JSON字符串。
  • 思考:如果JSON文件非常大,一次性加载到内存可能导致问题,json模块是否有流式处理的方法?(提示:查阅json.JSONDecoder)

—— 小象教研组

配套资料 · 直接下载

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

  • 本节课件: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 数据库
    下载