文件的作用
使用文件的目的:保存數(shù)據(jù)存放在磁盤
把一些存儲存放起來,可以讓程序下一次執(zhí)行的時候直接使用帮碰,而不必重新制作一份诸衔,省時省力
二芭届、文件的打開與關(guān)閉
思考:如果想用word編寫一份簡歷,應(yīng)該有哪些流程呢锌云?
步驟:新建--寫入數(shù)據(jù)--關(guān)閉
打開word軟件荠医,新建一個word文件寫入個人簡歷信息保存文件關(guān)閉word軟件
同樣,在操作文件的整體過程與使用word編寫一份簡歷的過程是很相似的
結(jié)論
打開文件,或者新建立一個文件讀/寫數(shù)據(jù)關(guān)閉文件
2.1 打開文件
在python彬向,使用open函數(shù)豫喧,可以打開一個已經(jīng)存在的文件,或者創(chuàng)建一個新文件open(文件名幢泼,訪問模式)
格式
f=open(‘文件’,'w')或者f=open('文件','r')
如下圖所示:不同的打開文件的方式
image-20210117131807308.png
常見的文件操作有:寫紧显,讀,追加
2.1.1 寫數(shù)據(jù)(write)
格式
對象=open("文件",w)對象.write("寫入數(shù)據(jù)")對象.close
案例:以寫的方式打開文件缕棵,寫入數(shù)據(jù)
f=open('test.txt','w')f.write('hello world, i am here!')f.close()
繼續(xù)寫入數(shù)據(jù)
f=open('test.txt','w')f.write('I love you')f.close()
總結(jié):
如果文件不存在那么創(chuàng)建孵班,如果存在那么就先清空,然后寫入數(shù)據(jù)
2.1.2 讀數(shù)據(jù)(read)
案例:以讀的方式打開文件招驴,讀取數(shù)據(jù)
格式
對象 = open("文件",r)變量 = 對象.read()print(變量)
案例:讀取文件(test.txt)
f=open('test.txt','r')content=f.read()print(content)
總結(jié):
如果用open打開文件時篙程,如果使用的"r",那么可以省略别厘,即只寫open('test.txt')如果沒有文件虱饿,打開報錯,存在該文件才能操作如果文件中存在中文顯示触趴,會出現(xiàn)亂碼需要添加encoding='utf-8'open(‘test.txt’,”r”,encoding='utf-8')
思考:如果只想讀取幾個字怎么操作?
案例:讀取指定長度的數(shù)據(jù)(單位是字節(jié))
f = open('test.txt', 'r')content = f.read(5)? # 最多讀取5個數(shù)據(jù)print(content)
注意:
使用read(num)可以從文件中讀取數(shù)據(jù)氮发,num表示要從文件中讀取的數(shù)據(jù)的長度(單位是字節(jié)),如果沒有傳入num冗懦,那么就表示讀取文件中所有的數(shù)據(jù)
2.1.3 讀數(shù)據(jù)(readlines)
就像read沒有參數(shù)時一樣爽冕,readlines可以按照行的方式把整個文件中的內(nèi)容進(jìn)行一次性讀取,并且返回的是一個列表披蕉,其中每一行的數(shù)據(jù)為一個元素
格式
對象=open("文件",r)變量=對象.readlines()print(變量)
案例:讀取文件(test.txt)
f = open('test.txt', 'r')content = f.readlines()print(content)print(type(content))
2.1.4 讀數(shù)據(jù)(readline)
readline可以按照行的方式把整個文件中的內(nèi)容進(jìn)行一行一行的讀取
格式
對象=open("文件",r)變量=對象.readline()print(變量)
案例颈畸,一行一行讀取
f=open('a.txt','r',encoding='utf-8')whileTrue:content=f.readline()ifcontent:print(content)else:break
2.1.5 可寫(a)
格式
對象=open("",a)對象.write("寫入數(shù)據(jù)")對象.close
案例,在文件中寫入數(shù)據(jù)
f=open("test.txt",a)f.write("新的數(shù)據(jù)")對象.close
總結(jié):
(可寫)形式打開文件没讲,如果文件不存在則創(chuàng)建并從頭添加寫入的內(nèi)容眯娱,存在則原有數(shù)據(jù)后追加數(shù)據(jù)
2.1.6 讀數(shù)據(jù)(rb)
格式1
對象 = open("二進(jìn)制文件",rb)變量= 對象.read()print(變量)
格式2
withopen("二進(jìn)制文件","rb")as對象:變量=對象.read()print(變量)
案例:使用盡可能多的方式實現(xiàn)讀取圖片
f = open('33.jpg', 'rb')content = f.read()print(content)
withopen("33.jpg","rb")asrf:res=rf.read()print(res)
使用習(xí)慣:格式2中不需要手動關(guān)閉文件,所以經(jīng)常被使用
總結(jié)
如果沒有文件爬凑,打開報錯徙缴,存在該文件才能操作
2.1.7 寫數(shù)據(jù)(wb)
格式
withopen("二進(jìn)制文件","wb")as對象:變量=對象.write()print(變量)
案例:備份圖片
withopen("1.jpg","rb")asrf:res=rf.read()withopen("textjpg.jpg","wb")aswf:res=wf.write(res)print(res)
2.2 關(guān)閉文件
格式
close()
2.3 思考題
如果一個文件很大,比如5G贰谣,試想應(yīng)該怎樣把文件的數(shù)據(jù)讀取到內(nèi)存然后進(jìn)行處理呢娜搂?
調(diào)用read()會一次性讀取文件的全部內(nèi)容,如果文件有10G吱抚,內(nèi)存就爆了百宇,所以,要保險起見秘豹,可以反復(fù)調(diào)用read(size)方法?每次最多讀取size個字節(jié)的內(nèi)容携御。另外,調(diào)用readline()可以每次讀取一行內(nèi)容,調(diào)用readlines()一次讀取所有內(nèi)容并按行返回list?因此啄刹,要根據(jù)需要決定怎么調(diào)用涮坐。如果文件很小,read()一次性讀取最方便誓军;如果不能確定文件大小袱讹,反復(fù)調(diào)用read(size)比較保險;如果是配置文件昵时,調(diào)用readlines()最方便
三捷雕、文件和文件夾的操作
文件的相關(guān)操作
有些時候,需要對文件進(jìn)行重命名壹甥、刪除等一些操作救巷,python的os模塊中都有這么功能
3.1 文件重命名
os模塊中的rename()可以完成對文件的重命名操作
格式
importosos.rename("需要修改的文件名","新文件名")
案例:
importosos.rename("test.txt","new.txt")
3.2 刪除文件
os模塊中的remove()可以完成對文件的重命名操作
格式
importosos.remove("文件名")
案例:
importosos.rename("new.txt")
文件夾的相關(guān)操作
2.1 創(chuàng)建文件夾
os模塊中的mkdir()可以完成對文件的重命名操作
2.2 獲取當(dāng)前目錄
os模塊中的getcwd()可以獲取當(dāng)前目錄
四、異常
1:什么是異常句柠?
異常即是一個事件浦译,該事件會在程序執(zhí)行過程中發(fā)生,影響了程序的正常執(zhí)行溯职。
一般情況下精盅,在Python無法正常處理程序時就會發(fā)生一個異常。
異常是Python對象缸榄,表示一個錯誤渤弛。
當(dāng)Python腳本發(fā)生異常時我們需要捕獲處理它,否則程序會終止執(zhí)行甚带。
演示異常
f=open("123.txt","r")#FileNotFoundError: [Errno 2] No such file or directory: '123.txt'list=[1,2,3]print(list[4])#IndexError: list index out of rangestr="jack"str.index("v")ValueError:substringnotfoundc=5/0print(c)#ZeroDivisionError: division by zero
2 異常處理
2.1 作用
捕捉異常可以使用try/except語句佳头。try/except語句用來檢測try語句塊中的錯誤鹰贵,從而讓except語句捕獲異常信息并處理。如果你不想在異常發(fā)生時結(jié)束你的程序康嘉,只需在try里捕獲它碉输。
2.2 語法
以下為簡單的try....except...else的語法
try:<語句>#運行別的代碼except<名字>:<語句>#如果在try部份引發(fā)了'name'異常else:<語句>#如果沒有異常發(fā)生
代碼
try:open("qwe.txt","r")print("123")exceptFileNotFoundError:print("異常處理")else:print("沒有異常")
try:open("qwe.txt","r")print("123")exceptFileNotFoundErrorasresult:print("異常處理",result)else:print("沒有異常")
2.3:使用except而不帶任何異常類型
你可以不帶任何異常類型使用except,如下實例
語法
try:正常的操作except:發(fā)生異常亭珍,執(zhí)行這塊代碼else:如果沒有異常執(zhí)行這塊代碼
代碼
try:open("qwe.txt","r")print("123")except:print("異常處理")else:print("沒有異常")
注意:以上方式try-except語句捕獲所有發(fā)生的異常敷钾。但這不是一個很好的方式,我們不能通過該程序識別出具體的異常信息肄梨。因為它捕獲所有的異常阻荒。
2.4:使用except而帶多種異常類型
語法
try:異常的操作except(Exception1[,Exception2[,...ExceptionN]]]):發(fā)生以上多個異常中的一個,執(zhí)行這塊代碼......................else:如果沒有異常執(zhí)行這塊代碼
代碼
list=[1,2,3,4]try:open("qwe.txt","r")list[7]except(NameError,FileNotFoundError)asrese:print("出現(xiàn)異常")else:print("沒有異常")
2.5:try-finally 語句
try-finally語句無論是否發(fā)生異常都將執(zhí)行最后的代碼
語法
try:<語句>finally:<語句>#退出try時總會執(zhí)行
案例
try:fh=open("test.txt","r")fh.readlines()fh.close()finally:print("Error: 沒有找到文件或讀取文件失敗")
注意:當(dāng)在try塊中拋出一個異常众羡,立即執(zhí)行finally塊代碼侨赡。
finally塊中的所有語句執(zhí)行后,異常被再次觸發(fā),并執(zhí)行except塊代碼羊壹。
參數(shù)的內(nèi)容不同于異常
2.6 異常的傳遞
代碼
deffunc1():print("---func1--1---")print(num)print("---func1--2---")# def func2():#? ? print("--func2--1---")#? ? func1()#? ? print("--func2--2---")deffunc3():try:print("---func3--1---")func1()print("--func3--2----")exceptExceptionasresult:print(result)print("--func3---3---")func3()#func2()
2.7:觸發(fā)異常
可以使用raise語句自己觸發(fā)異常
案例:輸入考生的成績(0~100)
deffunctionName(score):ifscore<0orscore>100:raiseException("Invalid score!",score)# 觸發(fā)異常后蓖宦,后面的代碼就不會再執(zhí)行functionName(200)
2.8:用戶自定義異常
定義
通過創(chuàng)建一個新的異常類,程序可以命名它們自己的異常油猫。異常應(yīng)該是典型的繼承自Exception類稠茂,通過直接或間接的方式
代碼:長度不低于3為
classShortInputException(Exception):def__init__(self,length,atleast):self.length=length? ? ? ? self.atleast=atleastdefmain():try:s=input('請輸入 --> ')iflen(s)<3:# raise引發(fā)一個你定義的異常raiseShortInputException(len(s),3)exceptShortInputExceptionasresult:#x這個變量被綁定到了錯誤的實例print('ShortInputException: 輸入的長度是 %d,長度至少應(yīng)是 %d'%(result.length,result.atleast))else:print('沒有異常發(fā)生')main()
五、模塊
Python 模塊(Module)情妖,是一個Python文件睬关,以.py 結(jié)尾,包含了Python 對象定義和Python語句
下例是個簡單的模塊 aa.py:
deftest1():print("我是模塊1")deftest2():print("我是模塊2")
5.1:模塊的引入
5.1.1:import
模塊定義好后鲫售,我們可以使用 import 語句來引入模塊共螺,語法如下
importmodule1[,module2[,...moduleN]]
test.py 文件代碼
importaaaa.test1()aa.test2()#我是模塊1#我是模塊2
導(dǎo)入python中的模塊os/math
代碼:開平方根
importmathprint(math.sqrt(4))#2
注意:一個模塊只會被導(dǎo)入一次,不管你執(zhí)行了多少次情竹。這樣可以防止導(dǎo)入模塊被一遍又一遍地執(zhí)行藐不。
5.1.2:from…import 語句
Python 的 from 語句讓你從模塊中導(dǎo)入一個指定的部分到當(dāng)前命名空間中,語法如下
frommodnameimportname1[,name2[,...nameN]]
test.py 文件代碼
fromaaimporttest1test1()#我是模塊1
注意:只能調(diào)用導(dǎo)入的模塊中的部分秦效,如果想使用test2,需要如下操作
fromaaimporttest1,test2test1()test2()#我是模塊1#我是模塊2
思考:如果需要導(dǎo)入模塊中的部分有很多雏蛮,怎么操作?
5.1.3:from…import * 語句
把一個模塊的所有內(nèi)容全都導(dǎo)入到當(dāng)前的命名空間也是可行的,只需使用如下聲明:
frommodnameimport*
test.py 文件代碼
fromaaimport*test1()test2()#我是模塊1#我是模塊2
擴(kuò)展
使用__all__魔幻方法當(dāng)被引入的包中有__all__=(),里面指定的才能被調(diào)用阱州,調(diào)用的時候使用from模塊名import*
aa.py
__all__=('test1','test2')deftest1():print("我是模塊1")deftest2():print("我是模塊2")deftest3():print("我是模塊2")
test.py
fromaaimport*test1()test2()
六挑秉、Python中的包
包是一個分層次的文件目錄結(jié)構(gòu),它定義了一個由模塊及子包苔货,和子包下的子包等組成的 Python 的應(yīng)用環(huán)境犀概。
簡單來說,包就是文件夾夜惭,但該文件夾下必須存在init.py 文件, 該文件的內(nèi)容可以為空姻灶。init.py 用于標(biāo)識當(dāng)前文件夾是一個包。
考慮一個在 day 目錄下的 runoob1.py诈茧、runoob2.py产喉、init.py 文件,test.py 為測試調(diào)用包的代碼敢会,目錄結(jié)構(gòu)如下
test.pyday|--__init__.py|--runoob1.py|--runoob2.py
源代碼如下:
day/runoob1.py
defrunoob1():print"I'm in runoob1"
day/runoob2.py
defrunoob2():print"I'm in runoob2"
然后我們在 day同級目錄下創(chuàng)建 test.py 來調(diào)用 day 包
# 導(dǎo)入 Phone 包fromday.runoob1importrunoob1fromday.runoob2importrunoob2runoob1()runoob2()
結(jié)果
I'minrunoob1I'minrunoob2
補(bǔ)充python常用模塊