Python爬虫存储数据 - 使用JSON存储

208 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

清明假期来了,是我用一周工作六天换来的,可恶的调休. 今天去研究一下,Python使用JSON去存储数据.

什么是JSON

JSON是Java Script Object Notion 是JavaScript对象标记,通过对象和数组来表示数据,构造简单,但是结构化程度非常高,是一种轻量级的数据交换格式.

对象和数组

在JavaScript当中,一切皆对象,所以任何支持的数据类型都尅一通过JSON来表示,比如啊字符串,数字,数组等等.

对象在JavaScript当中使用{}包围起来来表示形式为:{key1:Value1,key2:Value2}是键值对这种形式的,在面向对象这种语言上面,Key表示对象的属性,Value代表属性的值,前者用整数和字符串来表示,后者可以用任意类型

数组在JavaScript当中是使用[]来包起来的内容,形式为:["Java","JavaScript"] 这种结构,并且在JavaScript当中,数组是一个比较特殊的存在,它可以像对象那样使用键值对的结构.数组的内容可以是上面的对象. 而Json由上面组合而成能够无限次嵌套,结构清晰,数据交换的很好的实现方式

读取JSON

我的理解啊,Json 是Python中的列表与字典的结合.

import json

str =''' [{"name":"Flynt","age" : 18},{"name" : "flora", "age":18}]  '''
print(type(str))
data = json.loads(str)
print(data)
print(type(data))

运行结果:

image.png

我们使用了loads将字符串转变成为了JSON对象,由于最外面是中括号,所以最终的数据类型是list,这样我们就可以使用对应的索引来获取对应的内容了.比如


print(data[0]["name"])
print(data[0].get("name"))

我们可以得到 flynt,这里有一个小技巧,虽然这两种方式都可以实现取值,我推荐使用第二种,可以避免键名不存在报错只会返回none,不仅如此,使用print(data[0].get("name","hello"))如果该键名没有会返回传入的值,相当于设了一个默认值了.

读取文本JSON

with open("data.json",encoding="utf-8") as file:
    str = file.read()
    data = json.loads(str)
    print(data)

更简单的方式:

data = json.load(open("data.json",encoding="utf-8"))
print(data)

输出JSON

str = [{"name":"Flynt","age" : 18},{"name" : "flora", "age":18}]
with open("data.json","w",encoding="utf-8") as file:
    file.write(json.dumps(str))

输出且保留缩进

str =  [{"name":"Flynt","age" : 18},
{"name" : "flora", "age":18}]
with open("data.json", 'w') as file:
    file.write(json.dumps(str, indent=2))

image.png

后记: 如果包含中文字符不识别的解决方案:

str =  [{"name":"Flynt","age" : 18},
{"name" : "flora", "age":18}]
with open("data.json", 'w') as file:
    file.write(json.dumps(str, indent=2,ensure_ascii=False))