1 json数据
1.1 什么是json数据
json是一种数据格式,满足json格式的数据就是json数据;文件后缀是.json,并且文件中内容满足json格式。
1.2 json格式
一个json中只有一个数据;并且这个数据是json支持的数据类型的数据。
json支持的数据类型
数字类型 - 包含所有的数字,包括整数和小数,例如:100,12.5
字符串 - 使用双引号括起来的字符集,例如:“123”,“abc123”
布尔 - true和false
数组 - 相当于python中的列表,使用中括号括起来,括号里面是json支持的任意类型的数据
例如:[“100”,“abc”,100,true]
字典 - 相当于python中的字典,使用{}括起来,括号里面是键值对,
键一遍是字符串,值是json支持的任意类型的数据
特殊值 - null(相当于None),表示空。
1.3 python中内置模块-json
python中有一个内置的模块用来支持对json数据的处理:json。
将json数据转换成python数据
将python数据转换成json数据
1.3.1 将json数据转换成python数据(loads)
loads(字符串) - 将json格式的数据转换成python对应的数据。
注意: 字符串的内容必须是json格式的数据。
json python
数字 整型/浮点型
字符串 字符串(双引号变单引号)
布尔 布尔(true ->True,false ->False)
数组 列表
字典 字典
import json
py1=json.loads('"abc"') #内层双引号是json格式,外层单引号是python格式
py2=json.loads('[100,200,true,"hello",null]')
print(py1,py2) # abc [100, 200, True,'hello', None]
py3=json.loads('100') # python中输入字符需加引号
print(py3) # 100
py4=json.loads('{"a":1,"b":[1,2],"c":3}')
print(py4) # {'a': 1, 'b': [1, 2], 'c': 3}
with open('data.json','r',encoding='utf-8') as f:
ff=f.read()
py6=json.loads(ff)
print(py5['data'][2]['name']) # 王二
1.3.2 将python数据转换成json数据(dumps)
dumps(数据) - 将python数据转换成内容符合json格式的字符串。
注意:转换后python中最终结果都是字符串,在json中才是对应的数据。
pyhon json
int/float 数字(在python中是字符串)
字符串 字符串(单引号会变双引号)
布尔 布尔(True变true,False变false)
列表/元祖 数组
字典 字典
js1=json.dumps(100) # 数字类型
print(js1,type(js1)) # 100 <class 'str'>
js4=json.dumps((10,'abc',True)) # 元祖
print(js4) # [10, "abc", true]
js4=json.dumps([100,'aaa',None]) # 列表
print(js4) # [100, "aaa", null]
js5=json.dumps({'a':10,'b':None,'c':['a','b']}) # 字典
print(js5) # {"a": 10, "b": null, "c": ["a", "b"]}
1.3.3 json文件操作相关方法(load和dump)
load(文件对象) - 将文件对象中的数据读出来并且转换成python对应的数据(文件对象中的内容必须是json格式的数据)
dump(数据,文件对象) - 将python数据转换成json格式的字符串,在写入文件对象中。
with open('data.json',encoding='utf-8') as f:
content=json.load(f)
print(content,type(content)) # ['a', 'b', 'c'] <class 'list'>
with open('data.json','w',encoding='utf-8') as f:
content=json.dump([1,2,3],f) # data中数据变为[1, 2, 3]
#自己实现dump方法
def my_dump(obj,file):
with open(file,'w',encoding='utf-8') as f:
strstr=json.dumps(obj)
f.write(strstr)
my_dump(['a','b','c'],'data.json') # [”a“, “b“, “c“]
2异常捕获
2.1 什么是异常
程序执行过程中出现错误,也叫出现异常.
2.2异常捕获
让本来会出现异常的位置,不出现异常,而是自己去处理异常出现的情况
2.3怎么捕获异常
2.3.1捕获所有的异常
语法:
try:
代码段1
except:
代码段2
执行过程:执行代码段1,如果代码段1中出现异常,程序不会崩溃,而是马上执行代码段2;如果代码段1中没有异常,不会执行代码段2。
try:
print([1,2][0]) # 1
print([1, 2][5]) # 下标越界,出现异常
except:
print('出现异常!')
2.3.2捕获指定的异常
语法:
try:
代码段1
except 错误类型名:
代码段2
执行过程:执行代码段1,当代码段1出现指定类型的异常后不崩溃,而是执行代码段2.
try:
print([1, 2][5]) # 下标越界,出现异常
print(int('abc')
print('+++++++++++')
except IndexError:
print('下标越界!')
2.3.3同时捕获多个异常,对不同的异常做出相同的反应
try:
代码段1
except(错误类型1,错误类型2,错误类型3.....):
代码段2
执行过程:执行代码段1,当代码段1中出现了指定的异常,不崩溃,然后执行代码段2.
try:
print([1,2][5]) # IndexError
print(int('abc')) # ValueError
print({'a':1}['b']) # KeyError
except (IndexError,KeyError,ValueError,FileNotFoundError,StopIteration):
print('出现多种异常中的一种')
2.3.4 同时捕获多个异常,对不同的异常做出不同的反应
try:
代码段1
except 错误类型1:
代码段2
except 错误类型2:
代码段3
try:
print([1,2][5]) # IndexError
except KeyError:
print('键越界')
except ValueError:
print('值错误')
except IndexError:
print('下标越界') # 下标越界
2.4 try-except-finally
try:
代码段1
except:
代码段2
finally:
代码段3
不管代码段1中是否出现异常,也不管异常是否能够捕获到,finally后面的代码段3都会执行!(写遗书的位置!)。
try:
print([1,2][1])
except ValueError:
print('aaa')
finally:
print('最后!!!')
print('最后~~~')
什么时候使用异常捕获:
明明知道某段代码可能会出现异常,但是又没有办法避免,就使用异常捕获。
# 输入成绩,直到输入的数据输入正确为止
while True:
try:
score=float(input('输入成绩:'))
break
except ValueError:
print('输入有误!请输入数字')
def txt(obj): # #封装一个函数,功能是获取指定文件中的内容(普通文本文件)
try:
with open(obj,'r',encoding='utf-8') as f:
content=f.read()
return content
except FileNotFoundError:
print('文件路径有误')
return ''
print(txt('data.json'))
3 抛出异常
抛出异常:主动让程序出现异常。
语法:
raise 错误类型 - 程序执行到raise语句的时候直接抛出异常并崩溃。
错误类型:错误类型必须是一个类,并且这个类是Exception的子类。
try:
age=int(input('请输入年龄:'))
if not 0<=age<=100:
raise IndexError
except:
print('输入有误')
练习:
添加多个学生信息(姓名,年龄,电话),添加完成后,将数据保存到json文件中,并且,上次添加的信息不会删除,下次再添加的时候,是在上次的基础上添加的。
import json
with open('message.json','r',encoding='utf-8') as ff: # 打开文件
file=ff.read() # # 从文件中读数据
add_list=json.loads(file) # 数据转列表
while True:
print('1.添加'+'\n'+'2.返回')
num=int(input('请输入选择1-2:'))
add_dict = {}
if num==1:
add_dict.clear()
name=input('请输入添加的姓名:')
age=input('请输入添加的年龄:')
tel=input('请输入添加的电话:')
stu={'name':name,'age':age,'tel':tel}
add_list.append(stu)
else:
break
content=json.dumps(add_list) # 将python数据转换成json数据
with open('message.json','w',encoding='utf-8') as f: # 写入
f.write(content)
with open('message.json', encoding='utf-8') as ff: # 读出文件
file=ff.read()
print(file) # [{"name": "2", "age": "2", "tel": "2"}]