JSON文件存储
JSON 文件存储
JSON,全称为 JavaScript Object Notation, 也就是 JavaScript 对象标记,通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。
对象和数组
在 JavaScript 语言中,一切皆为对象。因此任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。其中对象和数组是比较特殊且常用的两种类型。
对象在JavaScript中是使用花括号 {} 包裹起来的内容,数据结构为 {key1:value1, key2:value2, ...} 的键值对结构。在面向对象的语言中,key 表示对象的属性,value 表示属性对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。
数组在JavaScript中是方括号 [] 包裹起来的内容,数据结构为 ["java", "javascript", "vb", ...] 的索引结构。在 JavaScript 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对结构,但还是索引用得多。同样,值的类型可以是任意类型。
一个 JSON 对象可以写为如下形式:
[{
"name": "Bob",
"gender": "male",
"birthday": "1992-10-18"
}, {
"name": "Selina",
"gender": "female",
"birthday": "1995-10-18"
}]
由中括号包围的就相当于数组,数组中的每个元素可以是任意类型,这个实例中的元素是对象,由{}包围。
JSON 可以由以上两种形式自由组合而成,可以无限次嵌套,结构清晰,是数据交换的极佳方式。
读取 JSON
Python 提供了简单易用的 JSON 库来实现 JSON 文件的读写操作,可以调用 JSON 库的 loads 方法将 JSON 文本字符串转为 JSON 对象,可以通过 dumps() 方法将 JSON 对象转为文本字符串。
例如,这里有一段 JSON 形式的字符串,它是 str 类型,我们用 Python 将其转换为可操作的数据结构,如列表或字典:
import json str = '''
[{
"name": "Bob",
"gender": "male",
"birthday": "1992-10-18"
}, {
"name": "Selina",
"gender": "female",
"birthday": "1995-10-18"
}]
''' print(type(str))
data = json.loads(str)
print(data)
print(type(data))
运行结果如下:
<class 'str'>
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]
<class 'list'>
使用 loads 方法将字符串转为 JSON 对象。由于最外层是中括号,所以最终的类型是列表类型。
这样一来就可以用索引来获取对应的内容了。例如,如果想取第一个元素里的 name 属性,就可以使用如下方式:
print(data[0]['name'])
print(data[0].get('name'))
得到的结果都是:
Bob
Bob
通过中括号加 0 索引,可以得到第一个字典元素,然后再调用其键名即可得到相应的键值。获取键值时有两种方式,一种是中括号加键名,另一种是通过 get 方法传入键名。这里推荐使用 get 方法,这样如果键名不存在,则不会报错,会返回 None。另外,get 方法还可以传入第二个参数(即默认值),示例如下:
print(data[0].get('age'))
print(data[0].get('age', 25))
运行结果:
None
25
尝试获取年龄 age,其实在原字典中该键名不存在,此时默认会返回 None。如果传入第二个参数(即默认值),那么在不存在的情况下返回该默认值。
值得注意的是,JSON 的数据需要用双引号来包围,不能使用单引号。例如,若使用如下形式表示,则会出现错误:
import json
str = '''
[{
'name': 'Bob',
'gender': 'male',
'birthday': '1992-10-18'
}]
'''
data = json.loads(str)
运行结果:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 5 (char 8)
会出现 JSON 解析错误的提示。因为这里数据用单引号来包围,请千万注意 JSON 字符串的表示需要用双引号,否则 loads 方法会解析失败。
下面实例从 JSON 文本中读取内容,例如这里有一个 data.json 文本文件,其内容是刚才定义的 JSON 字符串,可以先将文本文件内容读出,然后再利用 loads 方法转化:
import json
with open('data.json', 'r') as file:
str = file.read()
data = json.loads(str)
print(data)
运行结果如下:
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]
还可以使用open方法读取文本文件,使用的是默认的读模式,编码指定为utf-8,并文件操作对象赋值为file。然后调用file对象的read方法读取了文本中的所有内容,赋值为str。接着再调用loads方法解析JSON字符串,将其转换为JSON对象。
还有更简便的写法,可以直接使用load方法传入文件操作对象,同样也可以将文本转化为JSON对象,写法如下:
import json
data = json.load(open('data.json', encoding='utf-8'))
print(data)
这里使用的是load方法,而不是loads方法。前者的参数是一个文件操作对象,后者的参数是一个JSON字符串。
两种写法的 运行结果完全一样。只不过load方法时将整个文件中的内容转换为JSOn对象,而loads方法可以更灵活地控制要转换的内容。两种方法可以在适当的环境下选择使用。
输出 JSON
可以调用 dumps 方法将 JSON 对象转化为字符串。例如,将上例中的列表重新写入文本:
import json
data = [{
'name': 'Bob',
'gender': 'male',
'birthday': '1992-10-18'
}]
with open('data.json', 'w') as file:
file.write(json.dumps(data))
利用 dumps 方法,可以将 JSON 对象转为字符串,然后再调用文件的 write 方法写入文本。
运行结果:

如果想保存 JSON 的格式,可以再加一个参数 indent,代表缩进字符个数。示例如下:
with open('data.json', 'w') as file:
file.write(json.dumps(data, indent=2))
运行结果:

这样得到的内容会自动带缩进,格式会更加清晰。
如果 JSON 中包含中文字符,会怎么样呢?将之前的 JSON 的部分值改为中文,再用之前的方法写入到文本:
import json
data = [{
'name': ' 王伟 ',
'gender': ' 男 ',
'birthday': '1992-10-18'
}]
with open('data.json', 'w') as file:
file.write(json.dumps(data, indent=2))

结果中中文字符都变成了 Unicode 字符,这并不是想要的结果。
为了输出中文,还需要指定参数 ensure_ascii 为 False,另外还要规定文件输出的编码:
with open('data.json', 'w', encoding='utf-8') as file:
file.write(json.dumps(data, indent=2, ensure_ascii=False))
file.write(json.dumps(data, indent=2, ensure_ascii=False))
这样就可以输出 JSON 为中文了。
类比loads和load方法,dumps同样也有对应的dump方法,可以直接JSON对象全部写入文件中,因此上述方法也可以写成如下形式:
json.dump(data, open('data.json', 'w', encoding='utf-8'), indent=2, ensure_ascii=False)
第一个参数为JSON对象,第二个参数可以传入文件操作对象,其他的indent、ensure_ascii对象保持不变,运行结果是一样的。
JSON文件存储的更多相关文章
- Python3编写网络爬虫09-数据存储方式二-JSON文件存储
2.JSON文件存储 全称为JavaScript Object Notation 通过对象和数组的组合来表示数据,构造简洁且结构化程度非常高.是一种轻量级的数据交换格式 2.1 对象和数组 在Java ...
- 使用 Json 文件存储
将爬取到的数据以 Json 文件形式存储: import json import requests req = requests.get('http://www.baidu.com/') data = ...
- 爬虫json文件存储形式
json的表现形式和python中的字典是没有很大区别的,唯一的区别是dict的键是可hash对象,而json只能是字符串. 对于json的操作可以分为两类 一是对字符串的操作: 当需要将python ...
- 爬虫文件存储:txt文档,json文件,csv文件
5.1 文件存储 文件存储形式可以是多种多样的,比如可以保存成 TXT 纯文本形式,也可以保存为 Json 格式.CSV 格式等,本节我们来了解下文本文件的存储方式. 5.1.1 TXT文本存储 将数 ...
- Python常用的数据文件存储的4种格式(txt/json/csv/excel)及操作Excel相关的第三方库(xlrd/xlwt/pandas/openpyxl)(2021最新版)
序言:保存数据的方式各种各样,最简单的方式是直接保存为文本文件,如TXT.JSON.CSV等,除此之外Excel也是现在比较流行的存储格式,通过这篇文章你也将掌握通过一些第三方库(xlrd/xlwt/ ...
- 【BOOK】数据存储—文件存储(TXT、JSON、CSV)
数据存储 文本文件-TXT.JSON.CSV 关系型数据库-MySQL.SQLite.Oracle.SQL Server.DB2 非关系型数据库-MongoDB.Redis 文件打开 open() ...
- Apache Spark技术实战之4 -- 利用Spark将json文件导入Cassandra
欢迎转载,转载请注明出处. 概要 本文简要介绍如何使用spark-cassandra-connector将json文件导入到cassandra数据库,这是一个使用spark的综合性示例. 前提条件 假 ...
- python webdriver 测试框架-数据驱动json文件驱动的方式
数据驱动json文件的方式 test_data_list.json: [ "邓肯||蒂姆", "乔丹||迈克尔", "库里||斯蒂芬", & ...
- csv、json 文件读取
1.CSV 文件存储 1.1 写入 简单示例 import csv with open('data.csv', 'a') as csvfile: writer = csv.writer(csvfile ...
- json和csv文件存储
一. json 1:基本概念 1.1 Json和Javascript JSON, 全称JavaScript Object Notation,它通过对象和数组的组合来表示数据.在JavaScript中一 ...
随机推荐
- [FAQ] jsoneditor 如何切换 mode 或者选择 modes
1. 用于切换编辑器模式:text.tree.code JSONEditor.setMode(mode) 2. 让 mode 变成可以选择的: const options = { modes: ['t ...
- dotnet 6 在 win7 系统 AES CFB 抛出不支持异常
本文记录在 win7 系统上调用 AES 加密时,采用 CFB 模式,可能抛出 CryptographicException 异常 可以看到抛出的异常提示是 System.Security.Crypt ...
- WPF 已知问题 某些设备上的应用在 WindowChromeWorker 抛出 System.OverflowException 异常
准确来说,这个不算是 WPF 的问题,而是系统等的问题.在某些设备上的使用了 WindowChrome 功能的 WPF 应用,将在运行过程,在 WindowChromeWorker 类里面抛出 Sys ...
- 开源相机管理库Aravis例程学习(五)——camera-api
目录 简介 例程代码 函数说明 arv_camera_get_region arv_camera_get_pixel_format_as_string arv_camera_get_pixel_for ...
- 由初中生实现的 Windows 12 网页版!
大家好,我是 Java陈序员. 这几天,逛 Github 的时候,看到了一个项目 win12 -- 仿 Windows12 网页版!被它实现的页面功能震撼到了,大家可以一起来感受下! 首先是登录页面. ...
- 如何禁用IntelliJ IDEA的LightEdit模式
更新pycharm之后发现有了个新功能,默认打开文件的时候会单独打开一个窗口,以文本编辑的模式打开,而不是用项目模式.这种打开方式被称为LightEdit Mode.效果如下, 可以注意到窗口很简洁, ...
- kubernetes 存储流程
PV 与 PVC PVC (PersistentVolumeClaim),命名空间(namespace)级别的资源,由 用户 or StatefulSet 控制器(根据VolumeClaimTempl ...
- 【深度学习】基础--NumPy
因为深度学习会应用到我们大学时候学习的数学知识---线性代数.(矩阵当年想起来还是挺有意思的,有考研的经历都有感觉) 而在计算机里面如何展示矩阵的计算和应用,就需要运用到NumPy,是Python的一 ...
- C#使用MX Component实现三菱PLC软元件数据采集的完整步骤(仿真)
前言 本文介绍了如何使用三菱提供的MX Component插件实现对三菱PLC软元件数据的读写,记录了使用计算机仿真,模拟PLC,直至完成测试的详细流程,并重点介绍了在这个过程中的易错点,供参考. 用 ...
- SaltStack 常用的一些命令
以下是 SaltStack 常用的一些命令: 查看帮助信息:salt --help检查Salt支持的操作系统:salt '*' test.ping查看Minion的版本号:salt '*' test. ...