【可乐编程】第26期 0基础学Python之23:JSON_腾讯视频v.qq.com
Hi 大家好,我是王可乐,欢迎回到我们的零基础学 Python 课程。今天的课程里,可乐要来为大家介绍一个非常有用的数据处理技能,教大家如何使用 Python 来处理一种非常常见的数据格式,叫做 JSON。
在我们的第一课中可乐就给大家提到过,计算机的主要工作就是处理数据,处理各种各样的数据。文档、网页,音乐照片视频,代码和程序,等等等等,计算机通过处理各种数据来帮助我们完成各种各样的事情。
在计算机的世界里,到处都是数据,数据以不同的组织方式存放在计算机中。一般来说,最容易被计算机处理的一类数据称作结构化数据。这种数据有着严格的格式定义,最常见的是一种二维表结构数据。
如果你熟悉 Excel,那么一定对这种二维表格不陌生。这种表格的每一列都有着清晰明确的定义,如果从中取出某一行数据,那么它的第一列一定是学号,后两列则一定是姓名和专业。这种数据通常使用数据库软件来保存,例如 MySQL, Microsoft Access 等等,并且可以使用一种叫做 SQL 的专门语言来对数据进行查询和操作。
和结构化数据相对的是非结构化数据。顾名思义,非结构化数据就是不能用结构化的二维表、数据库等工具来组织的数据。例如随意躺在你硬盘里的办公文档,幻灯片文件,或者照片、音乐,还有网页上的各种文章、视频,这些都是非结构化数据。在互联网时代,我们产生的大多数的数据都是非结构化数据,这些数据里也蕴含了丰富的价值,因此对这些数据的挖掘、分析也就非常重要。这些年大家非常熟悉的"大数据"、"数据挖掘"等概念,其实主要就是对互联网上产生的各种非结构化数据进行分析。
今天我们的主角是一类介于结构化数据和非结构化数据的数据,称作半结构化数据。所谓半结构化数据,和非结构化数据对比,它拥有一些非常明确的结构属性,使得对它的分析更加容易;而和结构化数据相比,它又没有那种严格的结构化规则,少了很多限制。
JSON 就是一种典型的半结构化数据格式,我们来看一个例子。
{
"name": "cole",
"age": 18,
"have_a_cat": true,
"contacts": [
{
"name": "mobile",
"phone": "10086"
},
{
"name": "unicom",
"phone": "10010"
}
]
}
屏幕上显示的就是一块 JSON 数据。大家应该很容易能够看出来,这块数据描述的是可乐的一些个人信息和两个联系人。另外,有些眼尖的同学可能已经发现了,这块 JSON 数据和可乐前面讲的 Python 集合数据结构好像啊。说对了,其实 JSON 标准中的各种数据和 Python 中的数据类型都是可以对应上的。例如,大括号表示 JSON 中的一个对象,在 Python 中我们叫字典;中括号表示 JSON 中的一个数组,和 Python 中的列表对应;JSON 中的字符串用双引号包裹,比 Python 限制多一点;此外整数、浮点数、布尔值也都和 Python 中的概念一一对应。
因此,使用 Python 来处理 JSON 数据也就非常容易了。Python 标准库中内置了一个叫做 json 的模块,可以很方便地将 JSON 数据解析为 Python 数据结构,或者反过来由生成 JSON 数据。我们还是先来看一个例子:
>>> import json # 首先,我们用 import 语句引入 json 模块
>>> data = { # 然后我们来定义一个字典数据
... 'foo': True, # 第一个 key foo,值为 True
... 'bar': 42, # 第二个 key bar,值为 42
... 'foobar': [0, 1], # 第三个 key foobar,值为一个列表,里面是 0 和 1
... }
>>> data # 我们来看一下,已经定义好了一个 Python 数据结构
>>> s = json.dumps(data) # 我们调用 json 模块的 dumps 函数
>>> s
>>> '{"foo": true, "bar": 42, "foobar": [0, 1]}'
可以看到,s 是一个字符串。这个字符串由单引号包裹,因为字符串内部使用了很多双引号,这样可以免去使用转义字符。字符串 s 中的内容就是一份 JSON 数据,通常我们把 JSON 数据保存在非关系型数据库或者文件中,例如我们把 s 写入一个文件:
>>> with open('C:\colecode\test.json', 'w') as f: #新建一个文件
... f.write(s) # 打开文件之后,我们把 s 写进去
...
>>>
这时大家可以试一下在 C 盘 colecode 目录中找到新生成的 test.json 这个文件,然后右键选择用 Sublime 或者记事本程序打开。可以看到,我们已经把一段 JSON 数据保存在这个文件里了。
实际上,由于用文件存储 JSON 数据非常常见,json 模块直接提供了将数据写入文件的功能。我们来看一下:
>>> with open('C:\colecode\test_b.json', 'w') as f: # 还是以写模式打开文件
... json.dump(data, f) # 然后,我们调用 json 模块的 dump() 函数,注意这个函数
比上面的 dumps 函数少了一个 s 哦
...
>>>
我们打开新生成的 test_b.json 文件看一下。可以看到,和上面的代码效果一样,我们把 JSON 数据保存了下来。
除了能够生成 JSON,Python 也能很方便地读取 JSON 数据,并将读到的数据用 Python 内部的数据结构来表示。例如:
>>> d = json.loads(s)
>>> d
{'foo': True, 'bar': 42, 'foobar': [0, 1]}
可以看到,loads() 函数输入了字符串 s 作为参数,返回的数据结构我们存放在变量 d 中。大家可以对比一下,d 和我们前面定义的 data 是不是一模一样呢?
和 dumps() 函数类似,loads() 函数也有一个对应的不带 s 的版本,支持从文件读取 JSON 数据。我们来看一下:
>>> with open('C:\colecode\test.json', 'r') as f: # 首先我们打开文件
... d2 = json.load(f) # 调用 load 函数读取文件中的内容
...
>>> d2 # 我们来查看一下
{'foo': True, 'bar': 42, 'foobar': [0, 1]}
这里,我们也成功地从文件中读取了 JSON 数据,存放在了变量 d2 中,和前面的 data,d 两个变量也是一样的。
当然,和很多其他的 Python 模块一样,json 模块也远不止上面这些简单的用法。例如,通过指定钩子函数,或者自定义编码方式,我们可以更加精细地调整 JSON 数据和 Python 数据结构之间的转换。由于我们的初级课程还缺少一些必须的只是,可乐就先跳过这些内容,留在以后的课程里再给大家介绍了。
最后,我们再看一个小问题。我们刚开始展示的这份 JSON 数据,可乐的信息和联系人(屏幕展示前面的那块数据),使用了类似 Python 代码的缩进方式来书写,比较容易被肉眼观察。而前面的几个例子里,我们用 dump() 或 dumps() 函数则是生成了挤在一起的一行数据,尽管有一些空格分割,但是并不太好辨认层级关系。实际上,dump() 这两个函数也支持以缩进的方式来输出 JSON 数据,例如:
>>> s_pretty = json.dumps(data, indent=4)
>>> print(s_pretty)
{
"foo": true,
"bar": 42,
"foobar": [
0,
1
]
}
这里,我们额外传入了一个 indent=4 的参数,指定使用四个空格来缩进 JSON 数据。可以看到,这样的 JSON 数据就好辨认多了。同样地,dump() 函数也支持 indent 这个参数,可以把好看的 JSON 输出到文件中去。load() 和 loads() 两个函数可以自动处理 JSON 数据中的空格,因此不用修改用法,读取这种带缩进的数据完全没有问题。
除了增加空格、换行来输出好看的 JSON 数据,还可以减少空格,使得输出的 JSON 数据更紧凑,占用空间也更小。例如:
>>> s = json.dumps(data, separators=(',', ':'))
>>> s
'{"foo":true,"bar":42,"foobar":[0,1]}'
这里 separators 参数是一个元组,第一个元素是输出 JSON 的元素分隔符,第二个元素是输出 JSON 的对象键值分隔符。我们前面的代码没有传递 separators 参数时,这两个分隔符默认分别是后面带一个空格的逗号和后面带一个空格的冒号,所以这里我们传递了不带空格的分隔符之后,输出的 JSON 数据就没有了空格,变得更加紧凑了。
好了,今天的内容就到这里了。今天的主题和前面有点不一样,我们没有介绍新的语法,而是为大家带来了数据这个话题。数据是一个非常大的话题,今天可乐为大家介绍了一些概念性的内容,希望大家可以在课后查一下资料,扩充一些知识(大数据了解一下)。
另外,JSON 是一种简洁、轻量、有结构的数据存储方式,特别是在 Web 时代应用特别广泛,大家可一定要掌握哦。
在下一节课里,可乐会开始另一个话题,为大家讲讲程序出错时候,可以怎么办。敬请期待哦。如果你喜欢我们的课程,欢迎关注我们的公众号“可乐编程”,同时也请转发给你的朋友们哦。可乐感谢大家的支持,我们下次课再见!