2018-09-03_day11json和異常處理

1.文件打開的簡(jiǎn)寫方式:文件打開操作完成后,會(huì)自動(dòng)關(guān)閉文件

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中的內(nèi)置的數(shù)據(jù)類型,用來表示二進(jìn)制
        print(line)

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

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

應(yīng)用:上傳文件或者上傳圖片像寒,下載圖片或者下載文件

2.json文件:有特定格式的一種文本形式,它有自己的語法瓜贾,json文件就是后綴是.json的文本文件

1.json格式對(duì)應(yīng)的數(shù)據(jù)類型及其表現(xiàn)

a.一個(gè)json文件中只能存一個(gè)數(shù)據(jù)诺祸,這個(gè)數(shù)據(jù)的類型必須是以下類型中的一種

類型 格式 意義
對(duì)象類型(object) {"a":10,"b":[1,2]} 相當(dāng)于字典
數(shù)組(array) [100,"abc"] 相當(dāng)于列表,里面的元素可以是任何類型
數(shù)字(number) 100,3.14祭芦,-100 包含整數(shù)和小數(shù)
字符串(string) "abc","hello.json" 必須是雙引號(hào)
布爾 true/false 真/假
特殊值null null 空值

數(shù)據(jù)接口業(yè)務(wù):

    import json
    #jso模塊是python中內(nèi)置的筷笨,專門用來處理json數(shù)據(jù)的一個(gè)模塊
2.json.load(fileobj):以json格式,獲取文件中的內(nèi)容,并將內(nèi)容轉(zhuǎn)換成相應(yīng)的python數(shù)據(jù)
3.loads(json格式字符串,編碼方式):將json格式的字符串轉(zhuǎn)換成python對(duì)應(yīng)的數(shù)據(jù)

4.python對(duì)json數(shù)據(jù)的支持

json 轉(zhuǎn)換成 python
json ---> python
對(duì)象 字典(dict)
數(shù)組 列表(list)
數(shù)字 整數(shù)(int)和浮點(diǎn)數(shù)(float)
布爾/true,false 布爾/True,False
null None
4.python轉(zhuǎn)換成json
python 轉(zhuǎn)換成 json
python ---> json
字典 對(duì)象
列表实束、元組 數(shù)組
整數(shù)/浮點(diǎn)數(shù) 數(shù)字
布爾/True,False true,flase
字符串 字符串(雙引號(hào))
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中的集合不能轉(zhuǎn)換成json數(shù)據(jù)奥秆,會(huì)報(bào)錯(cuò)
json.dump(None,f)

···

5.向json文件寫數(shù)據(jù)的方法json.dump(需要寫入json文件中的python數(shù)據(jù),json文件對(duì)象)

dumps(需要轉(zhuǎn)換成json格式字符串的python數(shù)據(jù)):把python中的數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)的json格式的字符串
···
jsonstr = json.dumps([1,2,3])
print(type(jsonstr)) #<class 'str'>
···
注意:python中的集合不能轉(zhuǎn)換成json數(shù)據(jù),會(huì)報(bào)錯(cuò)

練習(xí):用json文件來保存一個(gè)班的班級(jí)信息咸灿,包括班級(jí)名构订,和班上的所有的學(xué)生(包含名字,年齡和電話)
可以輸入信息避矢,添加學(xué)生悼瘾,也可以根據(jù)姓名刪除學(xué)生囊榜,刪除之后也是永久有效的。做到數(shù)據(jù)持久化

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中的集合不能轉(zhuǎn)換成json數(shù)據(jù)亥宿,會(huì)報(bào)錯(cuò)
        json.dump(None,f)

#練習(xí):用json文件來保存一個(gè)班的班級(jí)信息卸勺,包括班級(jí)名,和班上的所有的學(xué)生(包含名字烫扼,年齡和電話)
#可以輸入信息曙求,添加學(xué)生,也可以根據(jù)姓名刪除學(xué)生映企,刪除之后也是永久有效的
    dicall={'classname':'python1806','stumessage':[]}

    while True:
        print('1.添加學(xué)生')
        print('2.刪除學(xué)生')
        print('3.查看學(xué)生')
        print('4.退出')
        op = int(input('請(qǐng)輸入你的選擇:'))
        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('請(qǐng)輸入姓名:')
                        age = input('請(qǐng)輸入年齡:')
                        pnum = input('請(qǐng)輸入電話號(hào)碼:')
                        dic={'name':name,'age':age,'pnum':pnum}
                        dicall['stumessage'].append(dic)
                        json.dump(dicall,f2)
                        print('保存成功')
                elif op==2:
                    name = input('請(qǐng)輸入你要?jiǎng)h除的學(xué)生名字:')
                    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('班級(jí):%s'%dicall['classname'])
                    for student in dicall['stumessage']:
                        print('姓名:%s,年齡:%s,電話號(hào)碼:%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('請(qǐng)輸入姓名:')
                age = input('請(qǐng)輸入年齡:')
                pnum = input('請(qǐng)輸入電話號(hào)碼:')
                dic = {'name': name, 'age': age, 'pnum': pnum}
                dicall['stumessage'].append(dic)
                json.dump(dicall, f2)
                print('保存成功')

3.異常:程序崩潰了悟狱,報(bào)錯(cuò)了...

1.程序出現(xiàn)異常,但是不想因?yàn)檫@個(gè)異常而讓程序崩潰堰氓。這個(gè)時(shí)候就可以使用異常捕獲機(jī)制

例挤渐,輸入兩個(gè)數(shù),然后求這兩個(gè)數(shù)的商双絮,輸入的不是數(shù)字或者被除數(shù)為0
try:
num1 = input('please input num1:')
num2 = input('please input num2:')
print(num1/num2)
except:
print('你輸入的數(shù)據(jù)非法')
例:打開一個(gè)不存在的文件浴麻,不希望程序崩潰,只是讓程序?yàn)榭?br> try
with open('haha.txt') as f:
pass
except:
print('文件不存在')

2.怎么捕獲異常

形式1:捕獲try代碼塊里面所有異常
try:
需要捕獲異常的代碼塊(可能會(huì)出現(xiàn)異常的代碼塊

except:
出現(xiàn)異常后執(zhí)行代碼

其他語句

執(zhí)行過程:執(zhí)行try后面的代碼塊囤攀,一旦遇到異常软免,就馬上執(zhí)行except后面的代碼塊。執(zhí)行完后再執(zhí)行其他的語句
如果try里面的代碼塊沒有出現(xiàn)異常抚岗,就不執(zhí)行except后面的代碼塊或杠,而是直接執(zhí)行其他語句

形式2:
try:
需要捕獲異常的代碼塊(可能會(huì)出現(xiàn)異常的代碼塊

except 錯(cuò)誤類型:
出現(xiàn)異常后執(zhí)行代碼

其他語句

執(zhí)行過程:執(zhí)行try后面的代碼塊,一旦遇到指定錯(cuò)誤了下異常宣蔚,就馬上執(zhí)行except后面的代碼塊向抢。執(zhí)行完后再執(zhí)行其他的語句
如果try里面的代碼塊沒有出現(xiàn)異常,就不執(zhí)行except后面的代碼塊胚委,而是直接執(zhí)行其他語句

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

c.形式3
try:
需要捕獲異常的代碼塊(可能會(huì)出現(xiàn)異常的代碼塊

except (錯(cuò)誤類型1,錯(cuò)誤類型2...):
出現(xiàn)異常后執(zhí)行代碼

其他語句

d.形式4
try:
需要捕獲異常的代碼塊(可能會(huì)出現(xiàn)異常的代碼塊

except 錯(cuò)誤類型1:
出現(xiàn)錯(cuò)誤類型1執(zhí)行代碼1
except 錯(cuò)誤類型2:
出現(xiàn)錯(cuò)誤類型2執(zhí)行代碼2
...z

其他語句

練習(xí)1:

while True:
    try:
        num1=float(input('請(qǐng)輸入數(shù)字1:'))
        num2=float(input('請(qǐng)輸入數(shù)字2:'))
        print(r'%.2f/%.2f,%.2f'%(num1,num2,num1/num2))
        exit(0)
    except ValueError:
        print('不能輸入非數(shù)字字符')
    except ZeroDivisionError:
        print('除數(shù)不能為0')

d.形式5
try:
需要捕獲異常的代碼塊(可能會(huì)出現(xiàn)異常的代碼塊)
except:
出現(xiàn)異常后執(zhí)行代碼
finally:
不管有沒有異常挟鸠,都會(huì)執(zhí)行,可以作為文件關(guān)閉亩冬,密碼艘希,程序異常退出的善后以及回滾

3.拋出異常后面補(bǔ)充)
raise 錯(cuò)誤類型

num = input('請(qǐng)輸入一個(gè)奇數(shù):')
if int(num)%2 == 0
    raise KeyError
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市硅急,隨后出現(xiàn)的幾起案子覆享,更是在濱河造成了極大的恐慌,老刑警劉巖营袜,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撒顿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荚板,警方通過查閱死者的電腦和手機(jī)凤壁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門吩屹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拧抖,你說我怎么就攤上這事煤搜。” “怎么了唧席?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵擦盾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我袱吆,道長(zhǎng)厌衙,這世上最難降的妖魔是什么距淫? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任绞绒,我火速辦了婚禮,結(jié)果婚禮上榕暇,老公的妹妹穿的比我還像新娘蓬衡。我一直安慰自己,他們只是感情好彤枢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布狰晚。 她就那樣靜靜地躺著,像睡著了一般缴啡。 火紅的嫁衣襯著肌膚如雪壁晒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天业栅,我揣著相機(jī)與錄音秒咐,去河邊找鬼。 笑死碘裕,一個(gè)胖子當(dāng)著我的面吹牛携取,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帮孔,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼雷滋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了文兢?” 一聲冷哼從身側(cè)響起晤斩,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姆坚,沒想到半個(gè)月后澳泵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旷偿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年烹俗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爆侣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幢妄,死狀恐怖兔仰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蕉鸳,我是刑警寧澤乎赴,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站潮尝,受9級(jí)特大地震影響榕吼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜勉失,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一羹蚣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乱凿,春花似錦顽素、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至段审,卻和暖如春全蝶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寺枉。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工抑淫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人型凳。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓丈冬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親甘畅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子埂蕊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容