Day12- 總結(jié)

01-json數(shù)據(jù)

1.什么是json數(shù)據(jù)

json是一種數(shù)據(jù)格式,滿(mǎn)足json格式的數(shù)據(jù)就是json數(shù)據(jù)。
文件后綴是.json,并且文件中的內(nèi)容滿(mǎn)足json格式

2.json格式

一個(gè)json中只有一個(gè)數(shù)據(jù);并且這個(gè)數(shù)據(jù)是json支持的數(shù)據(jù)類(lèi)型的數(shù)據(jù)

json支持的數(shù)據(jù)類(lèi)型
數(shù)字類(lèi)型 - 包含所有的數(shù)字,包括整數(shù)和小數(shù),列如:100,21.5,-20
字符串 - 使用雙引號(hào)括起來(lái),列如:"123","abc123"
布爾 - true 和false
數(shù)組 - 相當(dāng)與python中的列表,使用[]括起來(lái),括號(hào)里面是json支持的任意類(lèi)型的數(shù)據(jù)
列如:["abc",100,true]
字典 - 相當(dāng)于python中的字典,使用{}括起來(lái),括號(hào)里面試鍵值對(duì)。
鍵一般是字符串,值是json支持的任意類(lèi)型的數(shù)據(jù)
特殊值 - null (相當(dāng)于None),表示空

3.python 中有一個(gè)內(nèi)置的模塊用來(lái)支持對(duì)json數(shù)據(jù)的處理:

a.將json數(shù)據(jù)轉(zhuǎn)換成python數(shù)據(jù)
b.將python數(shù)據(jù)轉(zhuǎn)換成json數(shù)據(jù)

import json

將json數(shù)據(jù)轉(zhuǎn)換成python數(shù)據(jù)

loads(字符串) - 將json格式的數(shù)據(jù)轉(zhuǎn)換成python對(duì)應(yīng)的數(shù)據(jù)
注意:這兒的字符串的內(nèi)容必須是json的數(shù)據(jù)

json - python
數(shù)字 整型/浮點(diǎn)型
字符串 字符串(雙引號(hào)會(huì)變單引號(hào))
布爾 布爾(true -> True,false ->False)
數(shù)組 列表
字典 字典

py1 = json.loads('100')
print(py1,type(py1))
# 100 <class 'int'>

py2 = json.loads('"afcg"')
print(py2,type(py2))
# afcg <class 'str'>

py3 = json.loads('true')
print(py3,type(py3))
# True <class 'bool'>

py4 = json.loads('[100,"abc",true,null]')
print(py4,type(py4))
# [100, 'abc', True, None] <class 'list'>

py5 = json.loads('{"abc":1,"qwe":[1,2]}')
print(py5,type(py5))
# {'abc': 1, 'qwe': [1, 2]} <class 'dict'>
# 練習(xí):
 with open('./data.json',encoding='utf-8')as f:
content = f.read()# 讀文件中的內(nèi)容
 data_dict = json.loads(content) # 將讀出的內(nèi)容轉(zhuǎn)換成python數(shù)據(jù)
 x = data_dict['data'][2]['age']
   print(x)

2.將python轉(zhuǎn)換成json數(shù)據(jù)

dumps(數(shù)據(jù)) - 將python數(shù)據(jù)轉(zhuǎn)換成內(nèi)容符合json格式的字符串
注意:最終結(jié)果是字符串

python json
int/float 數(shù)字
字符串 字符串(單引號(hào)會(huì)變雙引號(hào))
布爾 布爾(True -> true)
列表/元祖 數(shù)組

js1 = json.dumps(100)
print(js1,type(js1))
# 100 <class 'str'>

js2 = json.dumps('abcdaf123\/')
print(js2,type(js2))
# "abcdaf123\\/" <class 'str'>

js3 = json.dumps(True)
print(js3,type(js3))
# true <class 'str'>

js4 = json.dumps((10,'abc',True))
print(js4,type(js4))
# [10, "abc", true] <class 'str'>

js5 = json.dumps([10,'20',True])
print(js5,type(js5))
# [10, "20", true] <class 'str'>

# js6 = json.dumps({'a':10,'abc':True})
# print(js6,type(js6))
# [10, "20", true] <class 'str'>
# 練習(xí)2:添加多個(gè)學(xué)生信息(姓名,年齡,電話(huà)),添加完成后,將數(shù)據(jù)保存到j(luò)son文件中,并且上次添加的信息不會(huì)刪除,下次添加的時(shí)候,是在上次的基礎(chǔ)上添加

with open('student.json',encoding='utf-8')as f:
    content = f.read()
    list1 = json.loads(content)

while True:
    name = input('姓名:')
    age = int(input('年齡:'))
    tel = input('電話(huà):')
    dict1 = {'姓名':name,'年齡':age,'電話(huà)':tel}
    list1.append(dict1)
    value = input("是否繼續(xù)(y/n):")
    if value == 'n':
        break
print(list1)
with open('student.json','w',encoding='utf-8')as f:
    content = json.dumps(list1)
    f.write(content)

3.json文件操作相關(guān)方法

load(文件對(duì)象) - 將文件對(duì)象中的數(shù)據(jù)讀出來(lái),并且轉(zhuǎn)換成python對(duì)應(yīng)的數(shù)據(jù)
(文件對(duì)象中的內(nèi)容必須是json格式的數(shù)據(jù))
dump(數(shù)據(jù),文件對(duì)象) - 將python數(shù)據(jù)轉(zhuǎn)換成json格式的字符串,再寫(xiě)入文件對(duì)象中

# json.load()
# json,dump()

02-異常捕獲

1.什么事異常

程序執(zhí)行過(guò)程中出現(xiàn)錯(cuò)誤,也叫出現(xiàn)異常

2.異常捕獲

讓本來(lái)會(huì)出現(xiàn)異常的位置,不出現(xiàn)異常,而是自己處理異常出現(xiàn)的情況

3.怎么捕獲異常

a.情況1:捕獲所有的異常

try:
代碼段1
except:
代碼段2

執(zhí)行過(guò)程:執(zhí)行代碼段1,如果代碼段1出現(xiàn)異常,不會(huì)崩潰,而是馬上執(zhí)行代碼段2.
如果代碼段1沒(méi)有異常,不會(huì)執(zhí)行代碼段2

try:
    print([1,2][3])
except:
    print('出現(xiàn)異常!')

b.情況2:捕獲指定異常

語(yǔ)法:
try:
代碼段1
except 錯(cuò)誤類(lèi)型:
代碼段2

執(zhí)行過(guò)程:執(zhí)行代碼段1,當(dāng)代碼段1出項(xiàng)指定類(lèi)型的異常后不崩潰而是執(zhí)行代碼段2

try:
    print([1,2,3][10])
    print('-------')
    print(int('abc'))
    print('+++++++')
except IndexError:
    print('下標(biāo)越界!')

c.情況三:同時(shí)捕獲多個(gè)異常,對(duì)不同的異常做出相同的反應(yīng)

try:
代碼段1
except(錯(cuò)誤類(lèi)型1,錯(cuò)誤類(lèi)型2,錯(cuò)誤類(lèi)型3...):
代碼段2

執(zhí)行過(guò)程:執(zhí)行代碼段1,當(dāng)代碼段1中出現(xiàn)了指定的異常,不崩潰,然后執(zhí)行代碼段2

try:
    print([1,2][3])
    print(int('abc'))
except(IndexError,KeyError,ValueError):
    print('出現(xiàn)多個(gè)異常中的一個(gè)')

d.情況四:同時(shí)捕獲多個(gè)異常,對(duì)不同異常做出不同反應(yīng)

try:
代碼段1
except 錯(cuò)誤類(lèi)型1:
代碼段2:
except 錯(cuò)誤類(lèi)型2:
代碼段3

try:
    print(int('abc'))
    print(int('abc'))
except KeyError:
    print('鍵錯(cuò)誤!')
except IndexError:
    print('下標(biāo)越界!')
except ValueError:
    print('值錯(cuò)誤!')

4.try - except - finally

try:
代碼段1
except:
代碼段2
finally:
代碼段3

不管代碼段1中是否出現(xiàn)異常,也不管異常是否能夠捕獲到,finally 后面的代碼段3都會(huì)執(zhí)行

try:
    print([1,2][1])
except:
    print('aaa')

什么時(shí)候使用異常捕獲:
明明知道某段代碼可能會(huì)出現(xiàn)異常,但是又沒(méi)有辦法避免,就使用異常捕獲

# 練習(xí):統(tǒng)計(jì)學(xué)生的成績(jī),到輸入的結(jié)果是'end'
 while True:
     try:
        score = float(input('輸入成績(jī):'))
        break
        except ValueError:
        print('輸入有誤!請(qǐng)輸入數(shù)字')
# 封裝一個(gè)函數(shù),功能是獲取指定文件的內(nèi)容(普通文本文檔)
# 從封裝角度:調(diào)用者做的事情做的越少越好

def huoqu(file):
    try:
         with open(file,'r',encoding='utf-8')as f:
             content = f.read()
             return content
    except FileNotFoundError:
        print('文件路徑錯(cuò)誤!')
        return ''
text = huoqu('student.json')

03-拋出異常

拋出異常:主動(dòng)讓程序出現(xiàn)異常

語(yǔ)法:
raise 錯(cuò)誤類(lèi)型 - 程序執(zhí)行到raise的時(shí)候直接拋出異常
注意:錯(cuò)誤類(lèi)型必須是一個(gè)類(lèi),并且這個(gè)類(lèi)是Exception 的子類(lèi)

# 輸入年齡,如果輸入的年齡的范圍不再0到100,程序就崩潰
num = int(input())
if num< 0 or num>100:
    raise ValueError
else:
    print(num)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容