12.1 json数据
1.什么是json数据
json是一种数据格式,满足json格式的数据就是json数据。
文件后缀是‘.json’,且文件中内容满足json格式。2.json格式
一个json中只有一个数据;并且这个数据是json支持的数据类型的数据
json支持的数据类型
数字类型 - 包含所有的数字,包括整数和小数,如:100,20,12.5,-20
字符串 - 使用双引号括起来的字符集,例如:“abc123”,“123”
布尔 - true和false
数组 - 相当于python中的列表,使用[]括起来,括号里面是json支持的任意类型的数据。例如:["ab", 12, [1, 2]]
字典 - 相当于python中的字典,使用{}括起来,里面是键值对,键一般是字符串,值可以是json支持的任意类型的数据。
null - 相当于python中的None,表示空。
- 3.python中有个内置模块叫json,用来支持对json数据的处理:json
a.将json数据转成python数据
b.将python数据转换成json数据
import json
1.将json数据转换成python数据
json.loads(字符串) - 将json格式数据转换成python格式数据。
注意:这儿的字符串内容必须是json格式数据。内容!!如:'"abc"'
json | python |
---|---|
数字 | 整型/浮点型 |
字符串 | 字符串(双引号会变单引号) |
布尔 | 布尔(ture>Ture;false>False) |
数字 | 列表 |
字典 | 字典 |
null | None |
#json.loads('abc') # JSONDecodeError
# a.数字转int/float
py1 = json.loads('100') # 100,int
print(py1, type(py1))
# b.字符串
py2 = json.loads('"abc"')
print(py2, type(py2)) # abc <class 'str'>
# c.布尔
# d.数组
py4 = json.loads('[1,2,3,4,"a",null]') # [1, 2, 3, 4, 'a', None]
print(py4)
# e.字典
py5 = json.loads('{"a":[1,2],"b":[23,32]}')
print(py5) # {'a': [1, 2], 'b': [23, 32]}
# 例:
# with open('data.json', 'r', encoding='utf-8') as js:
# j = js.read()
# print(j)
# py6 = json.loads('j')
js0 = '{"data":[{"name": "张三", "age": 18},\
{"name": "李四", "age": 20},{"name": "王五", "age": 19}],\
"code": 200,"messages": null} '
py7 = json.loads(js0)
print(py7)
print(py7['data'][2]['age'])
with open('data.json', 'r', encoding='utf-8') as js:
j = js.read()
py8 = json.loads(j)
print(py8)
print(py8['data'][2]['age']) # 19
2.将python数据转换成json数据
注意:最终结果是字符串!!!
json.dumps(python数据) - 将指定的pyhon数据转换成内容符合json格式的字符串。
python | json |
---|---|
int/float | 数字 |
字符串 | 字符串(单引号会变双引号) |
布尔 | 布尔(ture<Ture;false<False) |
列表/元组 | 数组 |
字典 | 字典 |
# a.int/float
py1_str = json.dumps(100)
print(py1_str, type(py1_str)) # '100' <class 'str'>
# b.字符串
js2 = json.dumps('hello hahaha')
print(js2) # '"hello hahaha"'
# c.布尔
js3 = json.dumps(True)
print(js3) # 'true'
# d.列表/元组
js4 = json.dumps(['a', 'b', 4])
js5 = json.dumps(('a', 'b', 4))
print(js4) # '["a", "b", 4]'
print(js5) # '["a", "b", 4]'
# e.字典
js6 = json.dumps({'a': None, 'b': 123, 12: 'abc'})
print(js6) # '{"a": null, "b": 123, "12": "abc"}'
# 练习2:以字典保存学生信息(姓名,年龄,电话),且上次添加的信息不会删除下次再添
# 加的时候,是在上次基础上添加的,保存到json文件中
# with open('lian_xi2.json', encoding='utf-8') as l_x:
# # 读出文件
# content = l_x.read()
# # 转成列表
# list1 = json.loads(content)
# for index in range(5):
# dict1 = {'姓名': input('请输入姓名:'), '年龄': input('请输入年龄:'),
# '电话': input('请输入电话:')}
# list1.append(dict1)
# # list1[index] = dict1
# print('写入成功!请选择是否继续:\n1.继续\n2.退出')
# n = input()
# if n == '1':
# continue
# else:
# with open('lian_xi2.json', 'w', encoding='utf-8') as l_x:
# content = json.dumps(list1)
# l_x.write(content)
# break
3.json文件操作相关方法
load(文件对象) - 将文件对象中的数据读出来,并且转换成python对应的数据(文件对象中的内容必须是json格式的数据,可以是列表,文本文件等)
dump(数据,文件对象) - 将python数据转换成json格式的字符串再写入文件对象中。
# load(文件对象)
with open('lian_xi2.json', encoding='utf-8') as l:
content = json.load(l)
print(content)
# dump(数据,文件对象)
with open('lian_xi2.json', 'w', encoding='utf-8') as f:
json.dump([1, 2, 4], f)
# 作业:封装自己的load方法,要求传入文件地址,就将文件对应的数据读出并转换成python数据。
import json
def my_load(files):
with open(files, 'r', encoding='utf-8') as m:
content = json.load(m)
return content
py0 = my_load('mu_biao.json')
print(py0)
# for key in py0['response']['data'][0]:
# print(py0['response']['data'][0][key])
12.2 json和异常捕获
1.什么是异常
程序执行过程中出现错误,也叫异常。2.异常捕获
让本来会出现异常的位置,不出现异常,而是自己去处理异常出现的情况。3.怎么捕获异常
结构一:捕获所有的异常
a.语法:
try:
代码段1(需要捕获异常的代码段)
except:
代码段2
b.执行过程:执行代码段1,如果代码段1中出现异常,不会崩溃,而是马上执行代码段2.如果代码段1无异常,不会执行代码段2。
try:
print('出现异常前')
print([1, 2, 3][3])
print('出现异常后') # 出现异常马上执行代码段2,所以此句不会执行
except:
print('出现异常!')
print('=====')
情况二:捕获指定的异常
a.语法:
try:
代码段1
except 错误类型名:
代码段2
b.执行过程:执行代码段1,当代码段1出现指定类型的异常后不崩溃,而是执行代码段2。
# try:
# print(int('出现ValueError异常'))
# print([1, 2, 3][3])
# print('出现IdexError异常')
# except IndexError:
# print('出现异常!')
#
# print('=====') # 直接崩溃,因为不捕获ValueError异常
try:
print(int('出现ValueError异常'))
print([1, 2, 3][3])
print('出现IdexError异常') # 不会执行
except ValueError:
print('出现异常!')
print('=====')
情况三:同时捕获多个异常,对不同的异常做出相同的反应。
try:
代码段1
except (错误类型1,错误类型2,错误类型3。。。):
代码段2
执行过程:执行代码段1,当代码段1中出现了指定的异常,不崩溃,然后执行代码段2。
try:
# print([1, 2, 3][3])
print({1: 2}[3])
except (IndexError, KeyError, ValueError, FileExistsError, StopIteration):
print('出现多个异常中的一种。')
情况四:同时捕获多个异常,对不同的异常做出不同的反应。
try:
代码段1
except 错误类型1:
代码段2
except 错误类型2:
代码段3
except 错误类型3:
代码段4
执行过程:执行代码段1,当代码段1中出现了指定的异常,不崩溃,然后执行代码段2。
try:
# print([1, 2, 3][3])
print({1: 2}[3])
except IndexError:
print('IndexError')
except KeyError:
print('KeyError')
4.try-except-finally
try:
代码段1
except:
代码段2
finally:
代码段3
不管代码段1是否出现异常,也不管异常是否能捕获到,程序崩溃前,finally后的代码段3都会执行。
常在代码段3中做数据备份,防止游戏突然崩溃!!
# 输入学生成绩直到输入正确为止
while 1:
try:
score = float(input('输入成绩:'))
break
except ValueError:
print('输入有误!请输入数字:')
什么时候使用异常捕获:
明明知道某段代码可能出现异常,但是又没办法避免,就使用异常捕获。
# 封装一个函数,功能是获取指定文件中的内容
# 从封装角度:越简单越方便越好。
def my_read(files):
try:
with open(files, encoding='utf-8') as f:
content = f.read()
return content
except FileNotFoundError:
print('输入文件地址错误,请核对地址!')
while 1:
files = input('请输入要打开的文件地址:')
str1 = my_read(files)
print('文件内容为:', str1)
12.3 抛出异常
抛出异常:主动让程序出现异常
语法:
raise 错误类型 - 程序执行到raise语句时,程序直接抛出异常
注意:错误类型必须是一个类,并且这个类是Exception的子类
# 输入年龄,如果输入年龄范围不在0-100,程序崩溃
while 1:
age = int(input('请输入年龄:'))
if age < 0 or age > 100:
raise ValueError