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

推荐阅读更多精彩内容