一. json数据
1.什么是json
"""
json是一种数据格式;几乎所有的高级语言都支持这种数据格式的处理,
所以json主要用于不同语言之间的数据交流。
"""
2.json格式
"""
json格式的要求:1)一个json有且只有一个数据
2)唯一的这个数据必须是json支持的数据类型的数据
json支持的数据类型:
1)数字类型(Number) - 所有数字对应的类型,表示的时候直接写。例如:100, -102, 12.3, 3e3
2)字符串(String) - 用双引号引起来的字符集(只能是双引号),"abc", "abc\n123", "\ue400abc"
3)布尔(Boolean) - 只有 true 和 false 两个值
4)数组(Array) - 相当于Python的列表
5)字典(Dictionary) - 相当于Python中的字典,key只能是字符串
6)空值 - null,相当于Python的None
"""
3.json数据和python数据之间的相互转换
python中提供了一个json模块,专门用来提供处理json数据相关的函数
1)json数据转python数据
"""
json -> python
数字 -> int/float
字符串 -> 字符串(可能会将双引号变成单引号)
布尔 -> 布尔(首字母变成大写字母)
数组 -> 列表(元素也会进行相应的转换)
字典 -> 字典(元素也会转换)
null -> None
json.loads(json格式的字符串) - 将json格式的字符串转换成对应的python数据;
json格式的字符串:字符串内容满足json格式
"""
result = json.loads('"abc"')
print(result, type(result)) # abc
result = json.loads('100')
print(result, type(result))
result = json.loads('["abc", 10, 123, true, null]')
print(result) # ['abc', 10, 123, True, None]
result = json.loads('{"a":"b", "c": 10}')
print(result) # {'a': 'b', 'c': 10}
# json数据
{"code":200,"msg":"success","newslist":[{"ctime":"2020-10-16 14:00","title":"2020款雷克萨斯LM300报价商务车豪华无疑,4驱动力全国上牌","description":"车讯网","picUrl":"https:\/\/img1.chexun.com\/chexunimg\/erpimg\/2020\/1016\/icon_default_211481971a1b42a684244c00a9fe5748.jpg","url":"http:\/\/www.chexun.com\/2020-10-16\/112034459.html"},{"ctime":"2020-10-16 14:00","title":"大通V90现车系列进军B型房车市场大通rv90价格特价","description":"车讯网","picUrl":"https:\/\/img1.chexun.com\/chexunimg\/erpimg\/2020\/1016\/icon_default_acffe29c8dc846c88d5e19e05b617aa0.jpg","url":"http:\/\/www.chexun.com\/2020-10-16\/112034467.html"},{"ctime":"2020-10-16 14:00","title":"2020新款亚特房车,大通V90地盘可上京牌多少钱","description":"车讯网","picUrl":"https:\/\/img1.chexun.com\/chexunimg\/erpimg\/2020\/1016\/icon_default_b1cf2be8498b42ad9d57d7f9a7f1ce42.jpg","url":"http:\/\/www.chexun.com\/2020-10-16\/112034495.html"},{"ctime":"2020-10-16 14:00","title":"拒绝定价套路,看到起亚K3才知道原来入门版本也能如此高配?","description":"车讯网","picUrl":"https:\/\/img1.chexun.com\/chexunimg\/erpimg\/2020\/1016\/icon_default_a0f1c4af868047978d607f5f9468f52d.jpg","url":"http:\/\/www.chexun.com\/2020-10-16\/112034521.html"},{"ctime":"2020-10-16 14:00","title":"华云途骏房车发布了一款全新升级改款的依维柯房车","description":"车讯网","picUrl":"https:\/\/img1.chexun.com\/chexunimg\/erpimg\/2020\/1016\/icon_default_fe94c5198ae64dec8308abe64eed7810.jpg","url":"http:\/\/www.chexun.com\/2020-10-16\/112034533.html"},{"ctime":"2020-10-16 14:00","title":"新款雷克萨斯LM300商务车四座\/七座报价","description":"车讯网","picUrl":"https:\/\/img1.chexun.com\/chexunimg\/erpimg\/2020\/1016\/icon_default_01c9a2839fde406595b7f25226359bac.jpg","url":"http:\/\/www.chexun.com\/2020-10-16\/112034545.html"},{"ctime":"2020-10-16 14:00","title":"本田冠道报价多少钱 最新优惠价格 现车最低价格 降价促销中","description":"车讯网","picUrl":"https:\/\/img1.chexun.com\/chexunimg\/erpimg\/2020\/1016\/icon_default_d394431c02144107b53b2461e4a64bef.jpg","url":"http:\/\/www.chexun.com\/2020-10-16\/112034565.html"},{"ctime":"2020-10-16 14:00","title":"依维柯大额头C型房车依维柯金冠单拓展房车特价","description":"车讯网","picUrl":"https:\/\/img1.chexun.com\/chexunimg\/erpimg\/2020\/1016\/icon_default_e26e5429ff014ec79b2891a951342a70.jpg","url":"http:\/\/www.chexun.com\/2020-10-16\/112034579.html"},{"ctime":"2020-10-16 14:00","title":"12.49万起售搭两种动力!奇瑞瑞虎8 PLUS值不值","description":"车讯网","picUrl":"https:\/\/img1.chexun.com\/chexunimg\/erpimg\/2020\/1016\/icon_default_43149639427b400c80d3942ab93da98f.jpg","url":"http:\/\/www.chexun.com\/2020-10-16\/112034605.html"},{"ctime":"2020-10-16 14:00","title":"本田CRV价格优惠 北京现车降价升级可分期","description":"车讯网","picUrl":"https:\/\/img1.chexun.com\/chexunimg\/erpimg\/2020\/1016\/icon_default_118655c1c37d44a2a0a55e2130651fc6.jpg","url":"http:\/\/www.chexun.com\/2020-10-16\/112034701.html"}]}
# 实例1:json文件数据解析,取出title中的内容
with open('data.json', encoding='utf-8') as f:
result = f.read()
re = json.loads(result)
for i in re['newslist']:
print(i['title'])
2)python数据转json数据
"""
python -> json
int 数字
float 数字
字符串 字符串(引号会变成双引号)
布尔 布尔(True -> true;False -> false)
列表、元组 数组(元素也会自动转换)
字典 字典(key全部自动变成字符串)
None null
json.dumps(python数据) - 将指定的python数据转换成json格式的字符串
"""
result = json.dumps(10)
print(type(result), 10) # <class 'str'> 10
result = json.dumps([10, 12.3, 'abc', None, True])
print(result) # '[10, 12.3, "abc", null, true]'
result = json.dumps({'a': 10, 10: 100})
print(result) # {"a": 10, "10": 100}
二. 异常捕获
1.什么是异常
异常就是错误(程序报错就是程序出现异常)
执行程序的过程中如果出现异常,程序会直接结束(实际上是线程结束)
2.什么是异常捕获
"""
1)
异常捕获就是让程序在出现异常的时候,不崩溃继续执行。
2)
不是任何异常都可以捕获的,只有在明知道某段代码会出现异常但是又不能或者不方便通过修改代码来避免这个异常,
这个时候就可以对异常捕获。
"""
3.怎么捕获异常
"""
方法一:捕获代码段1中所有异常
try:
需要捕获异常的代码段-代码段1
except:
捕获到异常后会执行的代码段
finally:
代码块
其他代码
执行过程:先执行try里面的代码段,执行过程中如果出现异常,程序不崩溃,马山执行except后面的代码段,执行完后执行其他代码;
如果执行try里面的代码段没有出现异常,except后面的代码不会执行,直接执行其他代码
# 方法二:捕获指定异常
try:
需要捕获异常的代码段
except 异常类型:
捕获到指定异常后会执行的代码段
finally:
代码块
# 方法三:同时捕获多种异常,针对不同的异常做相同的处理
try:
需要捕获异常的代码段
except (异常类型1, 异常类型2, ...):
捕获到指定异常后会执行的代码段
finally:
代码块
# 方法四:同时捕获多种异常,针对不同的异常做不同的处理
try:
需要捕获异常的代码段
except 异常类型1:
捕获到指定异常后会执行的代码段
except 异常类型2:
捕获到指定异常后会执行的代码段
...
finally:
代码块
"""
# 方法一
try:
age = int(input('请输入年龄:'))
except:
print('输入年龄的格式不正确!')
# 方法二
try:
list1 = [10, 20]
print(list1[10])
except IndexError:
print('出现异常')
# 4.finally - 写遗书,程序崩溃前的最后一次挣扎
try:
list1 = [10, 20]
print(list1[10])
except KeyError:
print('出现异常')
finally:
print('我还要挣扎一下')
5.抛出异常 - 主动让程序崩溃
raise异常类型
异常类型可以是系统异常类型也可以是自定义的异常类型
def func1(age: int):
if age < 0 or age > 150:
raise ValueError
if age >= 18:
print('成年人')
else:
print('未成年')
func1(-1534) # ValueError