投稿    登录
  《Python3网络爬虫开发实战》赠书活动正在进行中!详情请戳赠书活动!欢迎参与!非常感谢!

[Python3网络爬虫开发实战] 5.1.2-JSON文件存储

Python 崔庆才 7503浏览 146评论

JSON,全称为JavaScript Object Notation, 也就是JavaScript对象标记,它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。本节中,我们就来了解如何利用Python保存数据到JSON文件。

1. 对象和数组

在JavaScript语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等,但是对象和数组是比较特殊且常用的两种类型,下面简要介绍一下它们。

  • 对象:它在JavaScript中是使用花括号{}包裹起来的内容,数据结构为{key1:value1, key2:value2, ...}的键值对结构。在面向对象的语言中,key为对象的属性,value为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。
  • 数组:数组在JavaScript中是方括号[]包裹起来的内容,数据结构为["java", "javascript", "vb", ...]的索引结构。在JavaScript中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引用得多。同样,值的类型可以是任意类型。

所以,一个JSON对象可以写为如下形式:

由中括号包围的就相当于列表类型,列表中的每个元素可以是任意类型,这个示例中它是字典类型,由大括号包围。

JSON可以由以上两种形式自由组合而成,可以无限次嵌套,结构清晰,是数据交换的极佳方式。

2. 读取JSON

Python为我们提供了简单易用的库来实现JSON文件的读写操作,我们可以调用库的loads()方法将JSON文本字符串转为JSON对象,可以通过dumps()方法将JSON对象转为文本字符串。

例如,这里有一段JSON形式的字符串,它是str类型,我们用Python将其转换为可操作的数据结构,如列表或字典:

运行结果如下:

这里使用loads()方法将字符串转为JSON对象。由于最外层是中括号,所以最终的类型是列表类型。

这样一来,我们就可以用索引来获取对应的内容了。例如,如果想取第一个元素里的name属性,就可以使用如下方式:

得到的结果都是:

通过中括号加0索引,可以得到第一个字典元素,然后再调用其键名即可得到相应的键值。获取键值时有两种方式,一种是中括号加键名,另一种是通过get()方法传入键名。这里推荐使用get()方法,这样如果键名不存在,则不会报错,会返回None。另外,get()方法还可以传入第二个参数(即默认值),示例如下:

运行结果如下:

这里我们尝试获取年龄age,其实在原字典中该键名不存在,此时默认会返回None。如果传入第二个参数(即默认值),那么在不存在的情况下返回该默认值。

值得注意的是,JSON的数据需要用双引号来包围,不能使用单引号。例如,若使用如下形式表示,则会出现错误:

运行结果如下:

这里会出现JSON解析错误的提示。这是因为这里数据用单引号来包围,请千万注意JSON字符串的表示需要用双引号,否则loads()方法会解析失败。

如果从JSON文本中读取内容,例如这里有一个data.文本文件,其内容是刚才定义的JSON字符串,我们可以先将文本文件内容读出,然后再利用loads()方法转化:

运行结果如下:

3. 输出JSON

另外,我们还可以调用dumps()方法将JSON对象转化为字符串。例如,将上例中的列表重新写入文本:

利用dumps()方法,我们可以将JSON对象转为字符串,然后再调用文件的write()方法写入文本,结果如图5-2所示。

图5-2 写入结果

另外,如果想保存JSON的格式,可以再加一个参数indent,代表缩进字符个数。示例如下:

此时写入结果如图5-3所示。

图5-3 写入结果

这样得到的内容会自动带缩进,格式会更加清晰。

另外,如果JSON中包含中文字符,会怎么样呢?例如,我们将之前的JSON的部分值改为中文,再用之前的方法写入到文本:

写入结果如图5-4所示。

图5-4 写入结果

可以看到,中文字符都变成了Unicode字符,这并不是我们想要的结果。

为了输出中文,还需要指定参数ensure_asciiFalse,另外还要规定文件输出的编码:

写入结果如图5-5所示。

图5-5 写入结果

可以发现,这样就可以输出JSON为中文了。

本节中,我们了解了用Python进行JSON文件读写的方法,后面做数据解析时经常会用到,建议熟练掌握。

转载请注明:静觅 » [Python3网络爬虫开发实战] 5.1.2-JSON文件存储

喜欢 (32)or分享 (0)

我的个人微信公众号,联系我请直接在公众号留言即可~

扫码或搜索:进击的Coder

进击的Coder

微信公众号 扫一扫关注

想结交更多的朋友吗?

来进击的Coder瞧瞧吧

进击的Coder

QQ群号 99350970 立即加入

进击的Coder灌水太多?

这里是纯粹的技术领地

激进的Coder

QQ群号 627725766 立即加入

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击下面的

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(146)个小伙伴在吐槽
  1. always a huge fan of linking to bloggers that I enjoy but dont get a lot of link like from
    Hot webcam2019-01-16 18:36 (1分钟前)回复
  2. Wonderful story, reckoned we could combine several unrelated information, nonetheless genuinely worth taking a look, whoa did a single master about Mid East has got far more problerms also
    Sexy chat2019-01-16 16:18 (2小时前)回复
  3. The info talked about in the article are a few of the very best out there
    Hot webcam2019-01-16 14:15 (4小时前)回复
  4. below you will uncover the link to some web-sites that we think you should visit
    gucci bags2019-01-16 10:29 (8小时前)回复
  5. Here are some of the web pages we advise for our visitors
    Tory Burch2019-01-16 09:32 (9小时前)回复
  6. usually posts some very intriguing stuff like this. If youre new to this site
    Tory Burch2019-01-16 07:35 (11小时前)回复
  7. although websites we backlink to beneath are considerably not related to ours, we really feel they are actually worth a go as a result of, so have a look
    gucci bags2019-01-16 07:34 (11小时前)回复
  8. check below, are some totally unrelated web-sites to ours, however, they're most trustworthy sources that we use
  9. Here are several of the internet sites we advocate for our visitors
  10. although web sites we backlink to below are considerably not related to ours, we feel they're essentially really worth a go through, so have a look
  11. Sites of interest we have a link to
1 8 9 10