2018-09-03_day11json和异常处理

1.文件打开的简写方式:文件打开操作完成后,会自动关闭文件

with open(filenpath,) as fileobject:
        fileobject().read()

with open(r'd:/error.PNG','rb') as fileobj:
    for line in fileobj:
        print(type(line))#bytes是python中的内置的数据类型,用来表示二进制
        print(line)

with open(r'd:/error.PNG','rb') as fileobj:
    content = fileobj.read()

with open('./new.jpg','wb') as ff:
    ff.write(content)

应用:上传文件或者上传图片,下载图片或者下载文件

2.json文件:有特定格式的一种文本形式,它有自己的语法,json文件就是后缀是.json的文本文件

1.json格式对应的数据类型及其表现

a.一个json文件中只能存一个数据,这个数据的类型必须是以下类型中的一种

类型 格式 意义
对象类型(object) {"a":10,"b":[1,2]} 相当于字典
数组(array) [100,"abc"] 相当于列表,里面的元素可以是任何类型
数字(number) 100,3.14,-100 包含整数和小数
字符串(string) "abc","hello.json" 必须是双引号
布尔 true/false 真/假
特殊值null null 空值

数据接口业务:

    import json
    #jso模块是python中内置的,专门用来处理json数据的一个模块
2.json.load(fileobj):以json格式,获取文件中的内容,并将内容转换成相应的python数据
3.loads(json格式字符串,编码方式):将json格式的字符串转换成python对应的数据

4.python对json数据的支持

json 转换成 python
json ---> python
对象 字典(dict)
数组 列表(list)
数字 整数(int)和浮点数(float)
布尔/true,false 布尔/True,False
null None
4.python转换成json
python 转换成 json
python ---> json
字典 对象
列表、元组 数组
整数/浮点数 数字
布尔/True,False true,flase
字符串 字符串(双引号)
None null

···
with open('json3.json','w',encoding='utf-8') as f:
# lst=["name",{"username":"lisi"},{"password":"123456"}]
# json.dump(lst,f)
# json.dump((1,2,3),f)
# json.dump(True,f)
# json.dump({1,2,3},f) #注意:python中的集合不能转换成json数据,会报错
json.dump(None,f)

···

5.向json文件写数据的方法json.dump(需要写入json文件中的python数据,json文件对象)

dumps(需要转换成json格式字符串的python数据):把python中的数据转换成对应的json格式的字符串
···
jsonstr = json.dumps([1,2,3])
print(type(jsonstr)) #<class 'str'>
···
注意:python中的集合不能转换成json数据,会报错

练习:用json文件来保存一个班的班级信息,包括班级名,和班上的所有的学生(包含名字,年龄和电话)
可以输入信息,添加学生,也可以根据姓名删除学生,删除之后也是永久有效的。做到数据持久化

import json
if __name__=='__main__':
    with open('json2.json','r',encoding='utf-8') as f:
        content=json.load(f)
        print(type(content[1]['username']))

    print(type(json.loads(r'{"a":12}',encoding='utf-8')))


    with open('json3.json','w',encoding='utf-8') as f:
        # lst=["name",{"username":"lisi"},{"password":"123456"}]
        # json.dump(lst,f)
        # json.dump((1,2,3),f)
        # json.dump(True,f)
        # json.dump({1,2,3},f)  #注意:python中的集合不能转换成json数据,会报错
        json.dump(None,f)

#练习:用json文件来保存一个班的班级信息,包括班级名,和班上的所有的学生(包含名字,年龄和电话)
#可以输入信息,添加学生,也可以根据姓名删除学生,删除之后也是永久有效的
    dicall={'classname':'python1806','stumessage':[]}

    while True:
        print('1.添加学生')
        print('2.删除学生')
        print('3.查看学生')
        print('4.退出')
        op = int(input('请输入你的选择:'))
        try:
            with open('stu.json','r',encoding='utf-8') as f:
                dicall = json.load(f)
                if op==1:
                    with open('stu.json','w',encoding='utf-8') as f2:
                        dicall['classname']='python1806'
                        name = input('请输入姓名:')
                        age = input('请输入年龄:')
                        pnum = input('请输入电话号码:')
                        dic={'name':name,'age':age,'pnum':pnum}
                        dicall['stumessage'].append(dic)
                        json.dump(dicall,f2)
                        print('保存成功')
                elif op==2:
                    name = input('请输入你要删除的学生名字:')
                    for student in dicall['stumessage']:
                        if student['name'] == name:
                            dicall['stumessage'].remove(student)

                            with open('stu.json','w',encoding='utf-8') as f3:
                                json.dump(dicall,f3)
                                print("删除成功")
                            break
                elif op==3:
                    print('班级:%s'%dicall['classname'])
                    for student in dicall['stumessage']:
                        print('姓名:%s,年龄:%s,电话号码:%s'%(student['name'],student['age'],student['pnum']))

                elif op==4:
                    exit(0)
        except:
            with open('stu.json', 'w', encoding='utf-8') as f2:
                dicall['classname'] = 'python1806'
                name = input('请输入姓名:')
                age = input('请输入年龄:')
                pnum = input('请输入电话号码:')
                dic = {'name': name, 'age': age, 'pnum': pnum}
                dicall['stumessage'].append(dic)
                json.dump(dicall, f2)
                print('保存成功')

3.异常:程序崩溃了,报错了...

1.程序出现异常,但是不想因为这个异常而让程序崩溃。这个时候就可以使用异常捕获机制

例,输入两个数,然后求这两个数的商,输入的不是数字或者被除数为0
try:
num1 = input('please input num1:')
num2 = input('please input num2:')
print(num1/num2)
except:
print('你输入的数据非法')
例:打开一个不存在的文件,不希望程序崩溃,只是让程序为空
try
with open('haha.txt') as f:
pass
except:
print('文件不存在')

2.怎么捕获异常

形式1:捕获try代码块里面所有异常
try:
需要捕获异常的代码块(可能会出现异常的代码块

except:
出现异常后执行代码

其他语句

执行过程:执行try后面的代码块,一旦遇到异常,就马上执行except后面的代码块。执行完后再执行其他的语句
如果try里面的代码块没有出现异常,就不执行except后面的代码块,而是直接执行其他语句

形式2:
try:
需要捕获异常的代码块(可能会出现异常的代码块

except 错误类型:
出现异常后执行代码

其他语句

执行过程:执行try后面的代码块,一旦遇到指定错误了下异常,就马上执行except后面的代码块。执行完后再执行其他的语句
如果try里面的代码块没有出现异常,就不执行except后面的代码块,而是直接执行其他语句

dict =['a':1,'b':2]
try:
    dict1['c']
    print(a[6])
except (IndexError,KeyError):
    print('下标越界')

c.形式3
try:
需要捕获异常的代码块(可能会出现异常的代码块

except (错误类型1,错误类型2...):
出现异常后执行代码

其他语句

d.形式4
try:
需要捕获异常的代码块(可能会出现异常的代码块

except 错误类型1:
出现错误类型1执行代码1
except 错误类型2:
出现错误类型2执行代码2
...z

其他语句

练习1:

while True:
    try:
        num1=float(input('请输入数字1:'))
        num2=float(input('请输入数字2:'))
        print(r'%.2f/%.2f,%.2f'%(num1,num2,num1/num2))
        exit(0)
    except ValueError:
        print('不能输入非数字字符')
    except ZeroDivisionError:
        print('除数不能为0')

d.形式5
try:
需要捕获异常的代码块(可能会出现异常的代码块)
except:
出现异常后执行代码
finally:
不管有没有异常,都会执行,可以作为文件关闭,密码,程序异常退出的善后以及回滚

3.抛出异常后面补充)
raise 错误类型

num = input('请输入一个奇数:')
if int(num)%2 == 0
    raise KeyError

推荐阅读更多精彩内容