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