2018-09-03 day11文件操作和異常捕獲

1.文件操作

1.基本過(guò)程:打開(kāi)文件--操作--關(guān)閉文件
2.open(路徑,打開(kāi)方式,encoding = "編碼方式")
a.路徑:絕對(duì)路徑(了解),相對(duì)路徑:./; ../
b.打開(kāi)方式:r,rb/br --讀;w,wb/bw,a--寫(xiě)
路徑不存在的時(shí)候,讀的方式打開(kāi)會(huì)報(bào)錯(cuò),寫(xiě)的方式打開(kāi)會(huì)新建文件
c.設(shè)置編碼:utf-8;gbk
注意:如果是以二進(jìn)制的形式打開(kāi)文件(rb/br,wb/bw)不能設(shè)置編碼方式
3.文件的讀和寫(xiě)
read()/readline ---讀
write---寫(xiě)
4關(guān)閉
f.close()
打開(kāi)文件和關(guān)閉文件的簡(jiǎn)寫(xiě)方式(常用的)
with open() as 文件變量名:
文件操作
文件操作完成后,會(huì)自動(dòng)關(guān)閉文件

#讀二進(jìn)制文件(上傳文件)
with open('./files/timg.jpg','rb') as f :
    #bytes是python中內(nèi)置的數(shù)據(jù)類(lèi)型,用來(lái)表示二進(jìn)制數(shù)據(jù)
    content = f.read()
    print(type(content))
    print(content)


    #將二進(jìn)制數(shù)據(jù)寫(xiě)入文件
with open('./files/new.jpg','wb') as f1:
    f1.write(content)

2.json文件

json是有特定格式的一種文本形式,它有自己的語(yǔ)法
json文件就是后綴是.json的文本文件

1.json格式對(duì)應(yīng)的數(shù)據(jù)類(lèi)型及其表現(xiàn)
一個(gè)json文件中只能存一個(gè)數(shù)據(jù),這個(gè)數(shù)據(jù)的類(lèi)型必須是以下類(lèi)型中的一個(gè)
類(lèi)型: 格式: 意義:
對(duì)象(object): {"a":10,"b":[1,2]} 相當(dāng)于字典
數(shù)組(array): [100,"asd",true,[1,2]] 相當(dāng)于列表,里面的元素可以是任何類(lèi)型
數(shù)字(number): 100 3.14 包含整數(shù)和小數(shù)
字符串(string): "asd","hello json"
布: true/false 是(真)/否(假)
null: null 空值

2.python對(duì)json數(shù)據(jù)的支持
json python
對(duì)象 字典(dict)
數(shù)組 列表(list)
數(shù)字 整數(shù)(int)和浮點(diǎn)型(float)
布爾/true,false 布爾(bool)/True.False
null None

json模塊是python中內(nèi)置的,專(zhuān)門(mén)用來(lái)處理json數(shù)據(jù)的一個(gè)模塊
1.load(json文件對(duì)象):以json的格式,獲取文件中的內(nèi)容.將內(nèi)容轉(zhuǎn)換成相應(yīng)的python數(shù)據(jù)
2.loads(json格式內(nèi)容的字符串,編碼方式):將json格式的字符串,轉(zhuǎn)換成python對(duì)應(yīng)的數(shù)據(jù)
3.dump(需要寫(xiě)入json文件中的python數(shù)據(jù),json文件對(duì)象)
dumps(需要轉(zhuǎn)換成json格式字符串的python數(shù)據(jù))
json轉(zhuǎn)python數(shù)據(jù)

with open('./files/json1.json','r',encoding='utf-8') as f:
    content = json.load(f)
    print(content)
    print(content["a"])

python轉(zhuǎn)json數(shù)據(jù)
python ---> json
字典 對(duì)象
列表,元組 數(shù)組
將python數(shù)據(jù),轉(zhuǎn)換成json字符串

json_str = json.dumps([2,3,4,'asd,True'])
print(json_str,type(json_str))

用json文件來(lái)保存一個(gè)班的班級(jí)信息,包括班級(jí)名和班上的所有的學(xué)生(名字,年齡,電話)
輸入學(xué)生信息添加學(xué)生
根據(jù)學(xué)生姓名刪除學(xué)生
做到數(shù)據(jù)持久化

json文件的數(shù)據(jù)格式
{
    "class_name":"班級(jí)名",
    "all_student":[
        {"name":"名字","age":"年齡","tel":"電話"},
        {"name":"名字","age":"年齡","tel":"電話"},
        {"name":"名字","age":"年齡","tel":"電話"}
    ]
}
#1.讀出保存班級(jí)信息的json文件的內(nèi)容
with open("./files/class_info.json","r",encoding="utf-8") as f:
    class_content = json.load(f)

name = input("姓名:")
age = input("年齡:")
tel = input("電話:")
stu = {"name":name,"age":int(age),"tel":tel}
class_content["all_students"].append(stu)
# class_info = {
#     "calss_name":"python1806",
#     "all_students":[
#         stu
#     ]
# }

#將最新的數(shù)據(jù)寫(xiě)入文件中
with open("./files/class_info.json","w",encoding="utf-8") as f:
    json.dump(class_content,f)


del_name = input("輸入想要?jiǎng)h除的學(xué)生姓名:")
with open("./files/class_info.json","r",encoding="utf-8") as f:
    class_content = json.load(f)

    for item in class_content["all_students"]:
        if del_name == item["name"]:
            class_content["all_students"].remove(item)
            break
    with open("./files/class_info.json", "w", encoding="utf-8") as f:
        json.dump(class_content, f)
    print(class_content)

數(shù)據(jù)的持久化
1.將數(shù)據(jù)從文件中讀出來(lái)
2.修改數(shù)據(jù)(增,刪,改)
3.將新的數(shù)據(jù)再寫(xiě)入文件中

3.異常捕獲

1.為什么要使用異常捕獲
異常:程序崩潰了,報(bào)錯(cuò)了...
程序出現(xiàn)異常,但是不想因?yàn)檫@個(gè)異常而讓程序崩潰,這個(gè)時(shí)候可以使用異常捕獲機(jī)制
2.怎么捕獲異常
形式1:捕獲try后代碼塊里的所有異常
try:
需要捕獲異常的代碼塊(可能會(huì)出現(xiàn)異常的代碼塊)
except:
出現(xiàn)異常后執(zhí)行代碼

執(zhí)行過(guò)程:執(zhí)行try后面的代碼塊,一旦遇到異常,就馬上執(zhí)行except后面的代碼塊
執(zhí)行完后再執(zhí)行其他語(yǔ)句
如果try里面的代碼塊沒(méi)有異常,就不執(zhí)行except后面的代碼塊,而是直接執(zhí)行其他語(yǔ)句

形式2:
try:
需要捕獲異常的代碼塊(可能會(huì)出現(xiàn)異常的代碼塊)
except 錯(cuò)誤類(lèi)型:
出現(xiàn)異常后執(zhí)行代碼

執(zhí)行過(guò)程:執(zhí)行try后面的代碼塊,一旦遇到指定的異常,就馬上執(zhí)行except后面的代碼塊
執(zhí)行完后再執(zhí)行其他語(yǔ)句
如果try里面的代碼塊沒(méi)有指定的異常,就不執(zhí)行except后面的代碼塊,而是直接執(zhí)行其他語(yǔ)句

c.形式3
try:
需要捕獲異常的代碼塊(可能會(huì)出現(xiàn)異常的代碼塊)
except (錯(cuò)誤類(lèi)型1,錯(cuò)誤類(lèi)型2....):
出現(xiàn)異常后執(zhí)行代碼

d.形式4
try:
需要捕獲異常的代碼塊(可能會(huì)出現(xiàn)異常的代碼塊)
except 錯(cuò)誤類(lèi)型1:
執(zhí)行語(yǔ)句塊1
except 錯(cuò)誤類(lèi)型2:
執(zhí)行語(yǔ)句塊2
....
d.形式5
try:
需要捕獲異常的代碼塊(可能會(huì)出現(xiàn)異常的代碼塊)
except:
出現(xiàn)異常后執(zhí)行代碼
finally:
不管有沒(méi)有捕獲到異常,都會(huì)執(zhí)行(就算崩潰也會(huì)執(zhí)行)
(在這做程序異常退出時(shí)的善后,一般做保存數(shù)據(jù)和進(jìn)度的工作)

3.拋出異常(后面補(bǔ)充)
raise 錯(cuò)誤類(lèi)型
a.輸入兩個(gè)數(shù),然后求在這兩個(gè)數(shù)的商是多少

import json
num1 = float(input("除數(shù):"))
num2 = float(input("被除數(shù):"))
print("%f / %f = %f" % (num2,num1,num2/num1))

b.打開(kāi)一個(gè)不存在的文件,不希望程序崩潰,只是讓讀出的內(nèi)容為空

with open("./files/info.json","r",encoding="utf-8") as f:
    content = json.load(f)
try:
    with open("./files/info.json", "r", encoding="utf-8") as f:
        content = json.load(f)
except IndentationError:
    print("文件不存在")

2.捕獲異常

#try-except
a = [1,2,3,4,5]
try:
    print(int("asd"))
    print(a[6])
except:
    print("捕獲異常")
print("*********")

dict1 = {"a":1,"b":2}
try:
    dict1["c"]
except (KeyError,IndexError):
    print("錯(cuò)了")
?著作權(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)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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