Python模块csv, json
〇、前言
本系列(指Python Moudules系列)每篇介绍一个或多个内容没有特别多模块
模块介绍依赖官方文档(https://docs.python.org/zh-cn/3.8/library/index.html)或其他第三方官方文档,主要是对其内容的补充和拓展
内容大部分来源官方文档,少部分来源网络。太过深奥的内容会只写出不介绍,或省略,或省略掉太过深奥的部分(例如省略部分参数),或通过补充介绍(补充介绍的前面通常会有参考网址)
注意内容非常依赖编号。内容中类的展示方式是"编号<数字>."表示类的构造方法(__init__),"编号<数字>.<数字>"表示类的方法或属性,方法一般是实例方法,其他方法会在前面备注,属性一般是实例属性,类属性会在后面备注。如果构造方法无需传参会直接展示类名
使用Python版本3.8,但也会补充高版本的修改和添加内容。系统Windows 7
系列WPS笔记及其他内容的百度网盘链接:
https://pan.baidu.com/s/1fTwjyoM81_OOAccPNhGE9Q?pwd=h3fg
颜色代表含义:
淡灰色:注释,一般前面有#
绿色:示例
橙色:拓展
紫色:示例中的input用户输入内容
红色、蓝色:突出或装饰文字作用
部分内容可能不严谨或者错误,欢迎指出

一、csv——CSV文件读写
(1)、CSV文件
# 摘抄自百度百科
1. 概念
· 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)
· 纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据
· CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件
2. 规则
· 开头是不留空,以行为单位
· 可含或不含列名,含列名则居文件第一行
· 一行数据不跨行,无空行
· 以半角逗号(即,)作分隔符,列为空也要表达其存在
· 列内容如存在半角引号(即"),替换成半角双引号("")转义,即用半角引号(即"")将该字段值包含起来。
· 文件读写时引号,逗号操作规则互逆。
· 内码格式不限,可为 ASCII、Unicode 或者其他。
· 不支持数字
· 不支持特殊字符
(2)、概念
csv内置模块实现了CSV格式表单数据的读写。其提供了诸如“以兼容Excel的方式输出数据文件”或“读取Excel程序输出的数据文件”的功能,程序员无需知道Excel所采用CSV格式的细节。此模块同样可以用于定义其他应用程序可用的CSV格式或定义特定需求的CSV格式
csv内置模块中的reader类和writer类可用于读写序列化数据。也可以用DictReader类和DictWriter类以字典的形式读写数据
(3)、变种与格式参数
1. dialect(变种)概念
为了更容易指定输入和输出记录的格式(例如使用什么字符分隔),特定的一组格式参数组合为一个dialect(变种)
一个变种是Dialect类的一个子类,它具有一组特定的方法和一个validate()方法
# validate()方法实测是验证变种是否有效,例如变种必须有delimiter属性
在创建reader或writer对象时,将某个字符串或Dialect类的子类指定为dialect参数。想要补充或覆盖dialect参数,可以再指定某些格式参数(关键字传参),这些参数的名字与Dialect类定义的属性相同
2. Dialect类
Dialect类是一个容器类,其属性包含有如何处理双引号、空白符、分隔符等信息。由于缺少严格的CSV规格描述,不同的应用程序会产生略有差别的CSV数据
Dialect(子类的)实例定义了reader和writer实例将具有怎样的行为
所有可用的Dialect名称会由函数list_dialects()返回
补充:容器
容器是可以包含其他对象的对象,是一种数据结构。例如list、set等都是容器
3. Dialect类的属性(格式参数)
3.1. delimiter(分隔符)
用于分隔字段的单字符,默认为','
3.2. escapechar(转义符)
用于转义单字符,默认为None,表示禁用转义
在写入时,用来在quoting设置为QUOTE_NONE的情况下转义delimiter,在doublequote设置为False的情况下转义quotechar
在读取时,用来除去escapechar后所跟字符的任何特殊含义
# QUOTE_NONE是csv模块的常量,具体见后
3.3. quotechar(引号字符)
用于包住含有特殊字符的字段的单字符,默认为双引号
# 此章所说的“特殊字符”指delimiter、quotechar、lineterminator等字符
3.4. doublequote
控制出现在字段中的quotechar本身应如何被引出,默认为True。为True时,双写quotechar;为False时,在quotechar前面放置escapechar
在写入时,如果doublequote是False,且没有定义escapechar,则在字段中发现quotechar时抛出Error异常
# Error异常是csv模块的异常
3.5. lineterminator(换行符)
放在writer产生的行的结尾,默认为'\r\n'
# reader经过硬编码,会识别'\r'或'\n'作为行的结尾,并忽略lineterminator
3.6. quoting
控制writer何时生成引号,以及reader何时识别引号,值可以是任何模块内QUOTE_开头的常量,默认为QUOTE_MINIMAL
3.7. skipinitialspace
如果为True,则忽略delimiter之后的空格。默认为False
3.8. strict
如果为True,则在输入错误的CSV是抛出Error异常。默认为False
# 实测Dialect类的子类必须定义delimiter, quoting, lineterminator属性,在quoting不为QUOTE_NONE时还需定义quotechar
补充:这里的默认值是指excel变种相应格式参数的值以及使用register_dialect()时的默认值
(4)、常量
1. QUOTE_ALL
指示writer对象为所有字段加上引号
2. QUOTE_MINIMAL
指示writer对象仅为包含特殊字符的字段加上引号
3. QUOTE_NONNUMERIC
指示writer对象为所有非数字字段加上引号
指示reader对象为所有未用引号引出的字段转换为float类型
4. QUOTE_NONE
指示writer对象不使用引号引出字段
# 在写入时,delimiter前面应该有escapechar。如果未设置escapechar,则遇到任何需要转义的字符时,writer都会抛出Error异常
指示reader对象不对引号字符进行特殊处理
(5)、函数
1. reader(csvfile, dialect='excel', **fmtparams)
返回一个reader对象,该对象将逐行遍历csvfile
csvfile——可以是任何支持迭代器协议(iterator协议)并在每次调用__next__()方法时都返回字符串的对象,例如文件对象和列表
# 如果csvfile是文件对象,则open()的newline参数应是'',因为如果没指定newline,则嵌入引号中的换行符将无法正确解析,且在写入时,使用'\r\n'换行的平台会有多余的'\r'写入
dialect——用于不同的CSV变种的特定参数组。可以是Dialect类的子类的实例或list_dialects()函数返回的字符串之一
# 实测也可以是Dialect类的子类
fmtparams——可以覆写当前变种格式中的单个格式设置。具体见(3)、变种与格式参数
csv文件的每一行读取为一个字符串组成的列表,不会执行自动数据类型转换
补充:迭代器协议
对象必须提供一个__next__()方法,且执行该方法要么返回迭代器中的下一项,要么就引起StopIteration异常终止迭代
2. writer(csvfile, dialect='excel', **fmtparams)
返回一个writer对象,该对象负责将用户的数据在给定的文件类对象上转换为带分隔符的字符串
csvfile——可以是任何具有write()方法的对象
# 如果csvfile是文件对象,则open()的newline参数应是'',原因见上
dialect, fmtparams:同reader()
None值会被当作空字符串写入,其他非字符串数据都会先用str()转换为字符串再写入,原因见官方文档
示例:
运行结果:
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b']
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b']
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b']
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b']
a.csv文件:
a,a,a,a,a,b,b,b,b,b
a,a,a,a,a,b,b,b,b,b
b.csv文件:
/a/|/a/|/a/|/a/|/a/|/b/|/b/|/b/|/b/|/b/
/a/|/a/|/a/|/a/|/a/|/b/|/b/|/b/|/b/|/b/
3. register_dialect(name[, dialect[, **fmtparams]])
将name和dialect关联起来
# 也就是将name添加进变种注册表,注册后的变种在使用writer()和reader()方法时可以传入字符串name
name——必须是字符串
dialect——Dialect类的子类或其子类的实例
fmtparams——覆写当前变种格式中的单个格式设置
如果没有指定dialect, fmtparams,则会使用格式参数的默认值
4. unregister_dialect(name)
从变种注册表中删除name对应的变种
如果name不是已注册的变种名称,则抛出Error异常
5. get_dialect(name)
返回name对应的变种。此函数返回的Dialect对象不可变
如果name不是已注册的变种名称,则抛出Error异常
6. list_dialects()
返回所有已注册变种的名称
7. field_size_limit([new_limit])
返回解析器当前允许的最大字段大小
new_limit——如果指定,则它称为新的最大字段大小
# 实测值为131072
(6)、Reader对象
1. 概念
Reader对象包括DictReader实例和reader()函数返回的对象
2. DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
创建一个对象,该对象在操作上类似于常规reader,但是将每行中的信息映射到一个字典,该字典的键由可选参数fieldnames给出
# 这里的字典像是{此列的标题: 此列的单元格}——以第一行的标题(或fieldnames参数)为键,其他的每行对应标题列下的单元格为值
# 也就是{字段名: 字段值}
f——同reader()的csvfile参数
fieldnames——是一个序列。如果省略,则以文件f第一行中的值将用作字段名。无论字段名是如何确定的,字典都将保留其原始顺序
# 这里个人理解的原始顺序是传入字典键的顺序是怎样的,for-in语句读取键的顺序就是怎样的
如果某一行中的字段多于字段名,则使用restkey(默认为None)指定的字段名作为键,剩余数据会被放入一个列表作为值,添加进字典
如果某一行(非空白行)的字段少于字段名,则缺失的字段值会使用restval(默认为None)的值来填充
dialect, args, kwds——传递给底层的reader()
3. Reader对象公开方法和属性
3.1. __next__()
返回reader的可迭代对象的下一行,返回值是一个列表(如果对象是由reader()返回)或字典(如果对象是一个DictReader实例),根据当前变种来解析
# 通常以next()的形式调用,使用for-in语句可以进行迭代
3.2. dialect属性
变种描述,只读,供解析器使用
3.3. line_num属性
源迭代器已经读取了的行数。它与返回的记录数不同,因为记录可能跨越多行
4. DictReader对象公开属性
4.1. fieldnames属性
字段名称。如果在创建对象时未传入字段名称,则首次访问时或从文件中读取第一条记录时会初始化此属性
示例:
创建一个目录,目录创建a.csv和main.py文件
a.csv文件:
姓名,班级,语文,数学,英语
A,三、(1),74,84,55
B,三、(1),95,91
C,三、(1),85,89,72
D,三、(1),86,56,78,120,150
main.py文件:
运行main.py结果:
['姓名', '班级', '语文', '数学', '英语']
{'姓名': 'A', '班级': '三、(1)', '语文': '74', '数学': '84', '英语': '55'}
{'姓名': 'B', '班级': '三、(1)', '语文': '95', '数学': '91', '英语': '缺失'}
{'姓名': 'C', '班级': '三、(1)', '语文': '85', '数学': '89', '英语': '72'}
{'姓名': 'D', '班级': '三、(1)', '语文': '86', '数学': '56', '英语': '78', '多余数据': ['120', '150']}
5
(7)、Writer对象
1. 概念
Writer对象包括DictWriter实例和writer()函数返回的对象
对于writer()函数返回的对象,行必须是可迭代对象;对于DictWriter实例,行必须是一个字典(这个字典将字段名映射到字段值)
注意写入的复数会被括号包围
2. DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
创建一个对象,该对象在操作上类似于常规writer,但会将字典映射到输出行
f——同reader()的csvfile参数
fieldnames——是由键组成的序列,指定传递给writerow()的字典中值被写入文件f的顺序
# 注意fieldnames不是可选参数
如果传递给writerow()的字典缺少fieldnames中的键,则可选参数restval(默认为空字符串)指定键要写入的值
如果传递给writerow()的字典的某些键在fieldnames中找不到,则可选参数extrasaction(默认为'raise')用于指定要执行的操作。如果值为'raise'则会引发ValueError异常;如果值为'ignore',则忽略多出的键
dialect, args, kwds——传递给底层的writer()
3. Writer对象公开方法和属性
3.1. writerow(row)
将row写入到writer的文件对象,根据当前变种进行格式化。返回对下层文件对象的write方法调用的返回值
# 如果writer是writer()函数返回的对象,则可迭代对象row作为一行,其中的每一个元素作为一个字段。如果writer是DictWriter的实例,则字典row作为一行,其中键值对处理见上文
3.2. writerows(rows)
rows是能迭代出多个上述row对象的迭代器,会将rows中的所有元素写入writer的文件对象,根据当前变种进行格式化
# 可迭代对象rows的每一个元素作为一行
3.3. dialect属性
变种描述,只读,供writer使用
4. DictWriter对象公开方法
4.1. writeheader()
写入一行字段名称(构造方法传入的fieldnames参数)到writer的文件对象中,根据当前变种进行格式化。此方法的返回值是内部使用的writerow()的返回值
示例:
运行结果:
a.csv文件:
姓名,班级,语文,数学,英语
A,三、(1),74,84,55
B,三、(1),95,91,缺失
C,三、(1),85,89,72
D,三、(1),86,56,78
(8)、内置变种
1. excel
定义了Excel生成的CSV文件的常规属性。它在变种注册表中的名称是'excel'
格式参数的值就是默认值
2. excel_tab
定义了Excel生成的、制表符分隔的CSV文件的常规属性。它在变种注册表中的名称是'excel-tab'
格式参数与excel的区别是分隔符是'\t'
3. unix_dialect
定义了在UNIX系统上生成的CSV文件的常规属性。它在变种注册表中的名称是'unix'
格式参数与excel的区别是换行符使用'\n'以及quoting值为QUOTE_ALL
(9)、Sniffer类
1. 作用
用于推断CSV文件的格式
2. 方法
2.1. sniff(sample, delimiters=None)
分析给定文本sample并返回一个Dialect子类,该子类中包含了分析出的格式参数
delimiters——该参数会被解释为字符串,该字符串包含了可能有效的分隔符
2.2. has_header(sample)
分析给定文本sample(假定为CSV格式),如果发现其首行为一组列标题则返回True。在检查每一列时,将考虑是否满足两个关键标准之一来估计sample是否包含标题:
· 第二至第n行包含数字值
· 第二至第n行包含字符串值,其中至少有一个值的长度与该列预期标题的长度不同
会对第一行之后的二十行进行采样;如果有超过一半的列+行符合标准,则返回True
# 此方法是一个粗略的启发式方式,有可能产生错误的真值和假值
补充:启发式方法 # 摘抄自百度百科
启发式方法指人在解决问题时所采取的一种根据经验规则进行发现的方法
示例:
运行结果:
/
True
二、json——JSON编码和解码器
(1)、JSON
# 摘编自菜鸟教程:https://www.runoob.com/json/json-tutorial.html
1. 概念
· JSON指的是JavaScript对象表示法(Java Script Object Notation)
· JSON是轻量级的文本数据交换格式
· JSON独立于语言:JSON使用Javascript语法来描述数据对象,但是JSON仍然独立于语言和平台。JSON解析器和JSON库支持许多不同的编程语言
· JSON具有自我描述性,更易理解
# 自我描述性也就是易于人阅读和编写
· JSON是纯文本
· JSON比XML更小、更快,更易解析
· JSON 具有层级结构(值中存在值)
2. 语法
· 数据在键/值对中
· 数据由逗号,分隔
· 使用斜杠\来转义字符
· 大括号{}保存对象
· 中括号[]保存数组,数组可以包含多个对象
3. JSON值
· 数字(整数或浮点数)
· 字符串(在双引号中)
· 逻辑值(true或false) # 注意是小写
· 数组(在中括号中)
· 对象(在大括号中)
· null # 相当于Python中的None
4. JSON键/值对(名称/值对)
· key必须是字符串,value可以是合法的JSON数据类型(上面提到的六个)
· key和value中使用冒号:分隔
· 每个键/值对使用逗号,分隔
5. JSON的两种结构
5.1. 对象
JSON对象在大括号{}中书写,是一个无序的键/值对集合
5.2. 数组
JSON数组在中括号[]中书写,是一个有序的值集合
# 值之间使用逗号,分隔
# 对象之间可以嵌套,数组之间也可以嵌套
6. JSON文件
· JSON文件的文件类型是.json
· JSON文本的MIME类型是application/json
(2)、概念
json内置模块(严格来说是一个包)用于对JSON数据进行编解码
# 解析不信任JSON数据时要小心,恶意的JSON字符串可能导致解码器消耗大量的CPU和内存资源,建议限制要解析的数据的大小
(3)、转换表
1. Python编码为JSON类型转换对应表

2. JSON解码为Python类型转换对应表

# 这个模块的编码器和解码器默认保护输入和输出的顺序。仅当底层的容器未排序时才会失去顺序
1. dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
使用“(3)、1”转换表将obj序列化为JSON格式化流到fp
obj——对象
fp——支持.write()方法的文件对象
# json模块始终产生str对象而非bytes对象。因此fp.write()必须支持str输入
# 以下参数只能使用关键字传参
skipkeys——如果为True(默认值为False),则不是基本对象的字典的键会被跳过;否则引发一个TypeError
# 这里“基本对象”包括str, int, float, bool或None
ensure_ascii——如果为True(默认值),则输出保证将所有输入的非ASCII字符转义(例如'Ⅰ'转义成'\u2160')。如果为False,则这些字符会原样输出
check_circular——如果为False(默认值为True),则容器类型的循环引用检验会被跳过
补充:循环引用
A对象引用B对象,B对象又引用A对象。这会导致RecursionError(或者更糟)
allow_nan——如果为False,则在对严格JSON规格范围外的float类型值(nan、inf和-inf)进行序列化时会引发一个ValueError。如果为True(默认值),则使用它们的JavaScript等价形式(NaN、Infinity和-Infinity)
indent——如果值为一个非负整数或者字符串,则JSON数组元素和对象成员会被以指定的缩进等级美化输出:
如果indent为零、负数或空字符串,则只会添加换行符
如果indent为正整数,则会让每一层缩进同样数量的空格
如果indent为一个字符串,则那个字符串会被用于缩进没一层
如果indent为None(默认值),则会选择最紧凑的表达
separators——指定数组和对象的分隔符,是一个(数组分隔符, 对象分隔符)元组
当indent为None时,默认值取(', ', ': '),否则取(',', ': ')
# 使用(',', ':')获得最紧凑的JSON表达式
default——是一个函数,当某个对象无法被序列化时它会被调用。它应该返回该对象的一个可以被JSON编码的版本或者引发一个TypeError。如果没有被指定(默认值),则会直接引发TypeError
sort_keys——如果为True(默认值为False),则字典的输出会以键的顺序排序
# 这里的“输出”指写入文件fp
cls——自定义的JSONEncoder子类(JSON编码器),使用此参数指定这个自定义子类;否则使用JSONEncoder
kw——当使用自定义的JSONEncoder子类时传入的额外的关键字参数
2. dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
使用“(3)、1”转换表将obj序列化为JSON格式化的str
参数的含义与dump()中的相同
# 此函数与dump()的区别是不是写入到文件而是返回序列化后的字符串
# JSON中键值对的键永远是str类型的。当一个对象被转化为JSON时,字典中的所有键都会强制转换为字符串
示例:
运行结果:
{"name":["a","b","\u0393"],"value":{"c":false,"d":null,"a":1,"b":2.2,"e":Infinity}}
{"name":["a","b","\u0393"],"value":{"a":1,"b":2.2,"c":false,"d":null,"e":Infinity}}
# 当sort_keys为True时,字典按键排序
a.json文件: # 美化输出,使用4个空格缩进
{
"name": [
"a",
"b",
"\u0393"
],
"value": {
"c": false,
"d": null,
"a": 1,
"b": 2.2,
"e": Infinity
}
}
3. load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
使用“(3)、2”转换表将fp反序列化为一个Python对象
fp——支持.read()方法并包含一个JSON文档的文件对象(文本文件或二进制文件)
# 以下参数只能使用关键字传参
# 下面两个参数能够被用于实现自定义解码器
object_hook——是一个可选函数,它会被每一个解码出的对象字面值(即一个dict)调用并传参,传参是对象字面值。此函数的返回值会取代原本的dict
object_pairs_hook——是一个可选函数,他会被每一个解码出的对象字面值调用并传参,传参是对象字面值组成的有序列表:[(键1, 值1), (键2, 值2)...]。此函数的返回值会取代原本的dict。如果object_hook也被定义,object_pairs_hook优先
parse_float——需要解码JSON浮点数的字符串时自动调用的函数,传入需解码的字符串,返回值取代原本值。默认状态下,相当于float(num_str)
# num_str是需解码的字符串
# 可以用于对 JSON 浮点数使用其它数据类型和语法分析程序
parse_int——需要解码JSON整数的字符串时自定调用的函数,传入需解码的字符串,返回值取代原本值。默认状态下,相当于int(num_str)
# 可以用于对 JSON 整数使用其它数据类型和语法分析程序
parse_constant——解码遇到字符串'-Infinity', 'Infinity', 'NaN'时自动调用的函数,传入遇到的字符串,返回值取代原本值
# 遇到无效的JSON数字可以使用它引发异常
cls——自定义的JSONDecoder子类(JSON解码器),使用此参数指定这个自定义子类;否则使用JSONDecoder
kw——当使用自定义的JSONDecoderr子类时传入的额外的关键字参数
如果反序列化的数据不是有效JSON文档,则会引发JSONDecodeError
4. loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
使用“(3)、2”转换表将s反序列化为一个Python对象
s——一个包含JSON文档的str, bytes或bytearray实例
其他参数的含义与load()中的相同
如果反序列化的数据不是有效JSON文档,则会引发JSONDecodeError
示例:
运行结果:
函数被调用,传入参数: 1
函数被调用,传入参数: 2.2
函数被调用,传入参数: Infinity
函数被调用,传入参数: [('f', '1'), ('g', '2.2'), ('h', 'Infinity')]
['a', 'b', ['c', 'd', 'e'], [('f', '1'), ('g', '2.2'), ('h', 'Infinity')], 'i']
(5)、编码器和解码器(类)
1. JSONEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
用于Python数据结构的可扩展JSON编码器
# 默认支持的对象和类型见“(3)、1”
为了拓展并识别其他对象,需要子类化并实现default()方法为其他对象o返回一个可序列化的对象,否则default()方法应调用超类实现(引发TypeError)
default——应是一个函数,每当某个对象无法被序列化时会被调用并传参该对象。此函数应返回该对象的一个可以被JSON编码的版本或者引发一个TypeError。如果没有指定,则会引发TypeError
# 可以通过实例化JSONEncoder调用encode(), iterencode()编码或创建JSONEncoder的子类,将子类传入dump()或dumps()的cls参数编码
其他参数见dump()函数
1.1. default(o)
在子类中实现这种方法使其返回o的可序列化对象,或者调用基础实现(引发TypeError)
1.2. encode(o)
返回Python数据结构o数据结构的JSON字符串表达方式
1.3. iterencode(o)
对给定对象o进行编码,返回每个可用的字符串表达方式的生成器
2. JSONDecoder(*, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)
简单的JSON解码器
# 默认解码执行见“(3)、2”
它将'NaN', 'Infinity'和'-Infinity'理解为它们对应的'float'值,这超出了JSON规范
strict——如果为False(默认值为True),则控制字符允许出现在字符串内。在此上下文中的控制字符编码在范围0——31内的字符,包括'\t', '\n', '\r'和'\0'
其他参数见load()函数
如果反序列化的数据不是有效JSON文档,则会引发JSONDecodeError
2.1. decode(s)
返回s的Python表示形式
# s是包含JSON文档的str对象
如果给定的JSON文档无效则引发JSONDecodeError
3. raw_decode(s)
从s中解码出JSON文档,返回一个Python表示形式的2元组:(解码内容, JSON文档在s中结束位置的序号)
# s是以JSON文档开头的str对象
这可用于从一个末尾可能有无关数据的字符串解码JSON文档
(6)、异常
1. JSONDecodeError(msg, doc, pos)
拥有以下附加属性的ValueError子类:
msg:未格式化的错误消息
doc:正在解析的JSON文档
pos:解析失败的文档的起始索引
# 也就是解析失败时的索引
lineno:与pos相对应的行
colno:与pos相对应的列
# 关于标准符合性和互操作性见官方文档