版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2023/5/17第7章文件和I/O主講人:目錄5/17/202321.文件基礎(chǔ)知識2.文件操作3.目錄操作2023/5/17概述本章要解決的問題如下:什么是文件怎樣操作文件怎樣操作目錄5/17/20231.文件基礎(chǔ)知識1.1什么是文件文件是存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù)集合,與文件名相關(guān)聯(lián)。按文件中的數(shù)據(jù)組織形式可以把文件分為兩類:文本文件二進(jìn)制文件5/17/20231.文件基礎(chǔ)知識1.2文件的打開或創(chuàng)建文件變量名=open(文件名[,打開方式[,緩沖區(qū)]])示例如下:f1=open('file1.txt','r')f2=open('file2.txt','w')5/17/20231.文件基礎(chǔ)知識1.3字符編碼編碼是用數(shù)字來表示符號和文字的一種方式,是符號、文字存儲(chǔ)和顯示的基礎(chǔ)。信息傳遞與編碼關(guān)系的例子如右圖所示:2023/5/171.文件基礎(chǔ)知識常見的編碼UTF-8GB2312GBKCP936Unicode2023/5/171.文件基礎(chǔ)知識1.4文件的寫入1.文本文件的寫入以下兩種方法可以進(jìn)行文本文件的寫入。write(str):將字符串str寫入文件。writelines(sequence_of_strings):寫多行到文件,其中sequence_of_strings是由字符串所組成的列表,或者迭代器。2023/5/171.文件基礎(chǔ)知識文件的寫過程與存儲(chǔ)如下圖:2023/5/171.文件基礎(chǔ)知識示例把字符串“重慶郵電大學(xué)123@cqupt”寫入文件F7_1.txt中,采用GBK編碼,顯示文件的長度(總字節(jié)),默認(rèn)采用的是GBK編碼。2023/5/171.文件基礎(chǔ)知識程序#Exp7_1.py#coding=GBKf=open('F7_1.txt','w')f.write('重慶郵電大學(xué)123@cqupt')f.seek(0,2) #把文件指針移到文件尾length=f.tell()#會(huì)返回文件尾的位置,其值剛好等于文件長度f.close()print('文件長度=',length)程序運(yùn)行結(jié)果文件長度=212023/5/171.文件基礎(chǔ)知識示例在Windows系統(tǒng)中,把字符串“重慶郵電大學(xué)123@cqupt”用UTF-8編碼寫入文件F7_2.txt中,并顯示文件的長度(總字節(jié)數(shù))。2023/5/171.文件基礎(chǔ)知識程序importcodecs #自然語言編碼轉(zhuǎn)換模塊#Exp7_2.py#coding=UTF-8s='重慶郵電大學(xué)123@cqupt'f=codecs.open('F7_2.txt','w','UTF-8')#UTF-8編碼方式f.write(s)f.seek(0,2) #把文件指針移到文件尾length=f.tell()#文件尾的位置,其值剛好等于文件長度(字節(jié)數(shù))f.close()print('文件長度=',length)程序運(yùn)行結(jié)果文件長度=272023/5/171.文件基礎(chǔ)知識示例在文件F7_2.txt末尾追加兩行內(nèi)容。#Exp7_3.pyf=open('F7_2.txt','a+')s='重郵在山上\n重郵景色很美\n'f.write(s)f.close()2023/5/171.文件基礎(chǔ)知識2.二進(jìn)制文件的寫入以下兩種方法可以進(jìn)行二進(jìn)制文件的寫入。一種是通過struct模塊的pack()方法把數(shù)字和布爾值轉(zhuǎn)換成字節(jié)串(以字節(jié)為單位的字符串),然后用write()方法寫入二進(jìn)制文件中,字符串則可直接寫入二進(jìn)制文件中。pack()方法的語法是:pack(格式串,數(shù)字對象表)。另外一種是用pickle模塊的dump()方法直接把對象轉(zhuǎn)換為字節(jié)串(bytes)并存入文件中。1.4文件的寫入2023/5/171.文件基礎(chǔ)知識示例把1個(gè)整數(shù)、1個(gè)浮點(diǎn)數(shù)、1個(gè)布爾型對象、1個(gè)字符串存入二進(jìn)制文件F7_4.dat中。#Exp7_4.py#coding=UTF-8importstructn=102400000x=10.24b=Trues='重慶郵電大學(xué)123@cqupt'sn=struct.pack('if?',n,x,b)#把整數(shù)n、浮點(diǎn)數(shù)x、布爾對象b依次轉(zhuǎn)換為字節(jié)串2023/5/171.文件基礎(chǔ)知識程序續(xù)f=open('F7_4.dat','wb')f.write(sn) #寫入字節(jié)串f.write(s) #字符串可直接寫入f.close()2023/5/171.文件基礎(chǔ)知識示例把1個(gè)整數(shù)、1個(gè)浮點(diǎn)數(shù)、1個(gè)字符串、1個(gè)列表、1個(gè)元組、1個(gè)集合、1個(gè)字典存入二進(jìn)制文件F7_5.dat中。#Exp7_5.py#coding=UTF-8importpicklef=open('F7_5.dat','wb')n=7i=102400000a=10.24s='中國人民123abc'lst=[[1,2,3],[4,5,6J,[7,8,9]]2023/5/171.文件基礎(chǔ)知識tu=(-5,10,8)coll={4,5,6}dic={'a':'apple','b':'banana','g':'grape','o':'orange'}try:pickle.dump(n,f)#表示后面將要寫入的數(shù)據(jù)個(gè)數(shù)pickle.dump(i,f)#把整數(shù)i轉(zhuǎn)換為字節(jié)串,并寫入文件pickle.dump(a,f)pickle.dump(lst,f)pickle.dump(i,f)pickle.dump(a,f) pickle.dump(lst,f) pickle.dump(i,f) pickle.dump(tu,f) pickle.dump(coll,f) pickle.dump(dic,f)except: print('寫文件異常!')#如果寫文件異常則跳到此處執(zhí)行f.close()2023/5/171.文件基礎(chǔ)知識1.5文件的讀取1.文本文件的讀取read([size]):讀取文件,如果文件大于size個(gè)字節(jié),則只讀取size個(gè)字節(jié);如果小于size個(gè)字節(jié),則讀取完;如果不設(shè)置size,則默認(rèn)讀取全部。readline([size]):讀取一行readlines([size]):讀取完文件2023/5/171.文件基礎(chǔ)知識示例讀取文件F7_1.txt的前8個(gè)字節(jié),并顯示:#Exp7_6.pyf=open('F7_1.txt','r')s=f.read(11)#讀取文件的前11個(gè)字節(jié)f.close()print('s=',s)print('字符串s的長度(字符個(gè)數(shù))=',len(s))程序運(yùn)行結(jié)果s=重慶郵電大學(xué)123@c字符串s的長度(字符個(gè)數(shù))=112023/5/171.文件基礎(chǔ)知識示例讀取文件F7_1.txt的全部內(nèi)容,并顯示:#Exp7_7.pyf=open('F7_1.txt','r')s=f.read()#讀取文件全部內(nèi)容f.close()print('s=',s)程序運(yùn)行結(jié)果s=重慶郵電大學(xué)123@cqupt2023/5/171.文件基礎(chǔ)知識示例使用readline()讀取文件F7_2.txt的每一行,并顯示:
#Exp7_8.pyf=open('F7_2.txt','r')whileTrue:line=f.readline()ifline=='':breakprint(line),#逗號不會(huì)產(chǎn)生換行符,但文件中有換行符,因此會(huì)換行f.close()程序運(yùn)行結(jié)果重慶郵電大學(xué)123@cqupt重郵在山上重郵景色很美2023/5/171.文件基礎(chǔ)知識示例使用readlines()讀取文件F7_2.txt的每一行,并顯示:#Exp7_9.pyf=open('F7_2.txt','r')s=f.readlines()forlineins:print(line),#逗號不會(huì)產(chǎn)生換行符,但文件中有換行符,因此會(huì)換行f.close()程序運(yùn)行結(jié)果重慶郵電大學(xué)123@cqupt重郵在山上重郵景色很美2023/5/171.文件基礎(chǔ)知識1.5文件的讀取2.二進(jìn)制文件的讀取用struct模塊的pack()方法完成轉(zhuǎn)換而寫的文件,應(yīng)該用read()方法讀出相應(yīng)數(shù)據(jù)的字節(jié)串,然后通過代碼還原數(shù)據(jù)。字符串不用還原。用pickle模塊的dump()方法完成轉(zhuǎn)換而寫的文件,應(yīng)該用pickle模塊的load()方法還原對象。2023/5/171.文件基礎(chǔ)知識1.5文件的讀?。?)使用read()方法字符串可以直接讀出,數(shù)字和布爾對象需要用struct模塊的unpack()方法還原。unpack()方法的語法是:unpack(格式串,字符串表)。2023/5/171.文件基礎(chǔ)知識讀取二進(jìn)制文件F7_4.dat中的數(shù)據(jù),并顯示:#Exp7_10.pyimportstructf=open('F7_4.dat','rb')sn=f.read(9)tu=struct.unpack('if?',sn)#從字節(jié)串sn中還原出1個(gè)整數(shù)、1個(gè)浮點(diǎn)數(shù)和1個(gè)布爾值,并返回元組。print(tu)n=tu[0]x=tu[1]bl=tu[2]print('n=',n)print('x=',x)print('bl=',bl)s=f.read(9)f.close()print('s=',s)程序運(yùn)行結(jié)果(102400000,10.239999771118164,True)n=102400000x=10.239999771118164bl=Trues='重慶郵電大學(xué)123@cqupt'2023/5/171.文件基礎(chǔ)知識1.5文件的讀取(2)使用pickle模塊的load()方法pickle模塊的load(f)方法可以從二進(jìn)制文件中讀取對象的字節(jié)串并還原對象,使用起來非常方便。參數(shù)f是文件對象,該方法返回還原后的對象。2023/5/171.文件基礎(chǔ)知識示例讀取二進(jìn)制文件F7_5.dat中的數(shù)據(jù),并顯示:#Exp7_11.pyimportpicklef=open('F7_5.dat','rb')n=pickle.load(f) #讀取文件的數(shù)據(jù)個(gè)數(shù)i=0whilei<n:x=pickle.load(f)print(x)i=i+1f.close()10240000010.24程序運(yùn)行結(jié)果中國人民123abc[1,2,3],[4,5,6J,[7,8,9](-5,10,8)set([4,5,6]){'a':'apple','b':'banana','g':'grape','o':'orange'}2023/5/171.文件基礎(chǔ)知識1.5文件的讀取3.文件指針的移動(dòng)寫入文件后,必須打開才能讀取寫入的內(nèi)容。讀取文件后,無法再次讀取讀過的內(nèi)容。seek(n),其中n>=0,seek(0)表示文件指針移到文件頭;n>0時(shí),表示移動(dòng)到文件頭之后的位置,從任意位置讀取內(nèi)容時(shí)或從任意位置覆蓋內(nèi)容時(shí)需要這樣做。seek(0,2)表示把文件指針移到文件尾,在追加新內(nèi)容時(shí)需要這樣做。2023/5/171.文件基礎(chǔ)知識示例把文件F7_1.txt中的“大”替換為“小”,再把“1”替換為“9”,最后在文件末尾增加“軟件學(xué)院”。#Exp7_12.py#coding=GBKf=open('F7_1.txt','r+')f.seek(5) #文件指針移到'大'的首字節(jié)上f.write('小') #用'小'覆蓋'大'f.seek(1) #文件指針移到'1'上f.write('9') #用'9'覆蓋'1'f.seek(0,2) #文件指針移到文件尾f.write('軟件學(xué)院')#增加新內(nèi)容f.close()2023/5/171.文件基礎(chǔ)知識1.5文件的讀取4.文件的關(guān)閉
關(guān)閉文件的原因如下:將寫緩存同步到磁盤。操作系統(tǒng)每個(gè)進(jìn)程打開文件的個(gè)數(shù)是有限的。如果打開文件數(shù)到了系統(tǒng)限制,再打開文件就會(huì)失敗。②最常用的方法就是,調(diào)用close()顯式地關(guān)閉文件。目錄2023/5/1721.文件基礎(chǔ)知識2.文件操作3.目錄操作2023/5/172.文件操作2.1常用的文件操作函數(shù)一般而言,文件的基本操作都需要os模塊和os.path模塊。2023/5/172.文件操作2.2文件的復(fù)制復(fù)制文件有以下兩種方式:可以用read()與write()方法來實(shí)現(xiàn)另外還可以用shutil模塊實(shí)現(xiàn)文件的復(fù)制,該模塊的copyfile()函數(shù)就可以實(shí)現(xiàn)文件的復(fù)制2023/5/172.文件操作示例編寫一個(gè)用來復(fù)制文件的函數(shù)。#Exp7_16.py#coding=GBKdefFileCopy(tar_File,res_File):#定義1個(gè)函數(shù)以完成文件的復(fù)制try:f=open(res_File,'rb')f2=open(tar_File,'wb')except:print('打開文件異常!')return-1s=f.read()f2.write(s)f.close()f2.close()return02023/5/172.文件操作示例用FileCopy()函數(shù)把文本文件F7_1.txt復(fù)制到文件F7_1_2.txt中,把二進(jìn)制文件F7_9.dat復(fù)制到F7_9_2.dat中。#Exp7_17.pyfromExp7_16importimportFileCopy#導(dǎo)入文件Exp7_16.py的方法FileCopyFileCopy('F7_9_2.dat','F7_9.dat')#調(diào)用導(dǎo)入的FileCopy方法FileCopy('F7_1_2.txt','F7_1.txt')#調(diào)用導(dǎo)入的FileCopy方法2023/5/172.文件操作示例用shutil模塊實(shí)現(xiàn)7_17.py的功能。#Exp7_18.pyimportshutilshutil.copyfile('F7_9_2.dat','F7_9.dat')#復(fù)制文件F7_9.dat到F7_9_2.datshutil.copyfile('F7_1_2.txt','F7_1.txt')#復(fù)制文件F7_1.txt到F7_1_2.txt2023/5/172.文件操作2.3文件的刪除文件的刪除,需要調(diào)用os模塊的remove()函數(shù)實(shí)現(xiàn),我們使用os.path模塊的exists()函數(shù)來確保被刪除文件存在。示例如下:importos,os.pathfilename='test1.txt'file(filename,'w')ifos.path.exists(filename):#確認(rèn)文件是否存在os.remove(filename)#如果存在則刪除else:print('%sdoesnotexist!'%filename)2023/5/172.文件操作2.4文件的重命名使用os模塊的rename()函數(shù)可實(shí)現(xiàn)對文件或者目錄的重命名。os.listdir(".") #列出當(dāng)前目錄的所有文件os.rename("hi.txt","hello.txt") #重命名文件2023/5/172.文件操作示例問題描述:若當(dāng)前目錄存在文件名為test1.txt的文件,將其重新命名為mytest1.txt,若mytest1.txt已存在,則給出是否需要繼續(xù)更名的提示。若不要,則提示更名不成功,退出程序;若要,則再次輸入更名信息,檢測新名是否已經(jīng)存在,不存在則執(zhí)行更名操作,輸出更名成功提示信息,若存在,則再次詢問是否更名。2023/5/172.文件操作#Exp7_19.pyimportos,os.pathfilename='test1.txt'rename='mytest1.txt'file_list=os.listdir('.')print(file_list)iffilenameinfile_list:#判斷需要重命名的文件是否存在while(renameinfile_list): #更名是否存在choice=input('有重命名,繼續(xù)嗎?(Y/N):')ifchoicein['Y','y']:rename=input('請重新輸入更新文件名:')else:breakelse: #更名不存在,則進(jìn)行更名os.rename(filename,rename)print('重命名成功')else:print('需要更名的文件不存在!')程序運(yùn)行結(jié)果['7-1.py','F7_1.txt','F7_14.dat','F7_1_2.txt','F7_2.txt','F7_4.dat','jp.py','mytest1.txt','ps.py','README.txt','test1.txt','test7-1.txt','test7-2.txt','Untitled1','__pycache__']2023/5/172.文件操作2.5文件的比較前面說明了文件內(nèi)容的查找統(tǒng)計(jì)與內(nèi)容的替換,這里將介紹如何利用difflib模塊實(shí)現(xiàn)對序列或文件的比較。2023/5/172.文件操作hello.txt的內(nèi)容為:helloworldhi.txt的內(nèi)容為:hihello#Exp7_22.pyimportdifflibimportosA=open('hello.txt','r')B=open('hi.txt','r')contextA=A.read()contextB=B.read()s=difflib.SequenceMatcher(lambdax:x=="",contextA,contextB)result=s.get_opcodes()fortag,i1,i2,j1,j2inresult:print("%scontextA[%d:%d]=%scontextB[%d:%d]=%s"%\(tag,i1,i2,contextA[i1:i2],j1,j2,contextB[j1:j2]))程序運(yùn)行結(jié)果insertcontextA[0:0]=contextB[0:3]=hiequalcontextA[0:5]=hellocontextB[3:8]=hellodeletecontextA[5:11]=worldcontextB[8:8]=目錄2023/5/1721.文件基礎(chǔ)知識2.文件操作3.目錄操作2023/5/173.目錄操作3.1目錄的創(chuàng)建(1)用mkdir(path)創(chuàng)建一個(gè)指定目錄。>>>importos>>>os.listdir('f:/')['$RECYCLE.BIN','360Downloads','KuGou','SogouDownLoad','SystemVolumeInformation','YoukuFiles']>>>os.mkdir('f:/mynewdir')#創(chuàng)建mynewdir目錄>>>os.listdir('f:/')['$RECYCLE.BIN','360Downloads','KuGou','mynewdir','SogouDownLoad','SystemVolumeInformation','YoukuFiles']2023/5/173.目錄操作3.1目錄的創(chuàng)建(2)用makedirs(path1/path2…)創(chuàng)建多個(gè)目錄。>>>os.mkdir('./Newdir/subdir')#試圖用mkdir創(chuàng)建兩級目錄:Newdir與下級目錄subdirTraceback(mostrecentcalllast):File"<stdin>",line1.in<module>FileNotFoundError:[WinError3]系統(tǒng)找不到指定的路徑。:'./Newdir/subdir'>>>os.mak
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 區(qū)域招商引資合同樣本
- 企業(yè)勞動(dòng)合同范本合輯
- 交通工具租賃合同
- 家具定做采購合同書格式
- 辦公樓租賃協(xié)議書示例
- 長期人壽保險(xiǎn)合同解讀
- 手機(jī)游戲獨(dú)家代理協(xié)議模板
- 大學(xué)園服訂購合同
- 2024軍事后勤保障綜合服務(wù)合同
- 2024年酒類銷售用人勞務(wù)合同范本
- 大學(xué)美育教程(高職)全套教學(xué)課件
- 高端保潔家政技能培訓(xùn)方案
- 丙型肝炎的防治課件
- 2023年西南交通大學(xué)輔導(dǎo)員招聘考試真題
- LY-T 3332-2022 森林保險(xiǎn)查勘定損技術(shù)規(guī)程
- 廣告制作安裝質(zhì)量保證措施
- 聚合物復(fù)合材料工藝課件
- 高校輔導(dǎo)員崗前培訓(xùn)課件
- Java程序設(shè)計(jì)項(xiàng)目式教程 教案 單元10 Java圖形用戶界面設(shè)計(jì)
- 指紋識別技術(shù)
- 醫(yī)院的門禁管理制度范文
評論
0/150
提交評論