1.json数据
1.什么是json数据
json是一种数据格式,满足json数据格式就是json数据(json文件里面是字符串,例如:' "abc" ')
文件后缀是.json,并且内容满足json格式
利用Python的json库解析json格式的数据时,如果是json格式的字符串,使用json.loads(str);如果是json文件,使用json.load(f)。含有中文的字符串转换成json数据时使用json.dumps(str, ensure_ascii=False) 就能显示中文
2.json格式
一个json中只有一个数据,并且这个数据是json支持的数据类型的数据
json支持的数据类型
数字类型 - 包含所有的数字
字符串 - 使用双引号括起来的字符集,"abc*123"
布尔 - true和false 首字母全小写
数组 - 相当于python中的列表,使用[]括起来,里面是json支持的任意类型的数据
字典 - 相当于python中的字典,使用{}括起来,里面是键值对,
键一般是字符串,值是json支持的任意类型的数据
特殊值 - null(相当于Python中的None),表示空
3.python中有一个内置的模块用来支持对json数据的处理;这个模块就叫json
a.将json数据转换成python数据
loads(字符串) - 将json格式的数据转换成python对应的数据
注意:这里的字符串的内容必须是json格式的数据
数字 -> 整型/浮点型
字符串 -> 字符串 双引号变成单引号
布尔 -> 布尔(true -> True, false -> False)
import json
- a.将json数据转换成python数据
py1 = json.loads('"abc"')
print(py1, type(py1))
py2 = json.loads('100.12')
print(py2, type(py2))
py3 = json.loads('[100, "abc", true, null]')
print(py3, type(py3))
py4 = json.loads('{"a": 1, "b": [1, 2], "c": true}')
print(py4, type(py4))
with open('data.json', encoding='utf-8') as f0:
content = f0.read()
py0 = json.loads(content)
for x in py0['data']:
if x['name'] == '王五':
print(x['age'])
b.将python数据转换成json数据
dumps(数据) — 将python数据转换成内容符合json格式的 字符串!!!
int/float -> 数字
字符串 -> 字符串(单引号变成双引号)
布尔 -> 布尔 首字母小写
列表/元组 -> 数组
字典 -> 字典
"""
js1 = json.dumps((1, 2.5, 'abc', True))
print(js1)
- 练习:添加多个学生信息(姓名,年龄,电话),添加完成后保存到json文件中
- 并且上次添加的信息不会删除
name = input('请输入姓名:')
age = input('请输入年龄:')
tel = input('请输入电话:')
dict1 = {'姓名': name, '年龄': age, '电话': tel}
with open('学生信息.json', encoding='utf-8') as ff:
content1 = ff.read()
py6 = json.loads(content1)
py6.append(dict1)
js2 = json.dumps(py6)
with open('学生信息.json', 'w', encoding='utf-8') as f:
f.write(js2)
4.json文件操作相关方法
load(文件对象) - 将文件对象中的数据读出来并且转换成python对应的数据
(文件对象的内容必须是json格式的数据)
dump(数据, 文件对象) - 将python数据转换成json格式的字符串,再写入文件对象中
2.异常捕获
1.什么是异常
程序执行过程中出现错误,也就是出现异常
2.异常捕获
让本来会崩溃的位置不出现异常,而是自己去处理异常出现的情况
3.怎么捕获异常
语法1(捕获所有的异常):
try:
代码段1
except:
代码段2
执行过程:
执行代码段1,如果代码段中出现异常,不会崩溃,而是马上执行代码段2
如果代码段1没有异常,不会执行代码段2
try:
print('--------')
print([1, 2, 3][4])
print('========')
except:
print('出现异常!')
print('++++++++++++')
语法2(捕获指定的异常):
try:
代码段1
except 异常类型名:
代码段2
执行过程:执行代码段1,当代码段1出现指定的类型异常后,不崩溃,而是执行代码段2
try:
print(int('abc'))
print('--------')
print([1, 2, 3][4])
print('========')
except ValueError:
print('出现异常!')
语法3(同时捕获多个异常,对不同的异常做出相同的反应):
try:
代码段1
except (错误类型1,错误类型2,...):
代码段2
执行过程:当执行代码段1,出现了指定异常中的一个异常,不崩溃,然后执行代码段2
try:
print([1, 2][2]) # IndexError
print(int('abc')) # ValueError
print({'a': 1}['b']) # KeyError
except (KeyError, ValueError, IndexError):
print('出现多个异常中的一个')
语法4(同时捕获多个异常,对不同的异常做出不同的反应):
try:
代码段1
except 错误类型1:
代码段2
except 错误类型2:
代码段3
...
4.try-except-finally
不管代码段1中是否出现异常,也不管是否能够捕获到,finally后面的代码段都会执行
try:
print([1, 2][3]) # IndexError
except ValueError:
print('aaa')
finally:
print('111')
print('-------')
什么时候使用异常捕获:
知道某段代码可能会出现不可避免的异常,就使用异常捕获
- 统计学生的成绩,直到输入的结果是'end'
- 最后求输入的成绩的和
while True:
try:
score = float(input('请输入成绩:'))
break
except ValueError:
print('输入有误,请重新输入数字!')
- 封装一个函数,获取指定文件中的内容(普通文本文件)
- 从封装角度:调用者做的事情越少越好
def get_file_content(file):
while True:
try:
with open(file, encoding='utf-8') as f:
content = f.read()
return content
except FileNotFoundError:
print('地址错误,请重新输入!')
3.抛出异常
抛出异常:主动让程序出现异常
语法:
raise 错误类型
程序执行到这个语句时,程序直接抛出异常
注意:错误类型必须是一个类,并且这个类是Exception的子类
- 输入年龄,如果输入的年龄的范围不在0-100,程序崩溃
age = int(input('请输入年龄:'))
if age > 100 or age < 0:
raise ValueError