day12-json和异常捕获

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容