Python程序設計第7章-文件和IO_第1頁
Python程序設計第7章-文件和IO_第2頁
Python程序設計第7章-文件和IO_第3頁
Python程序設計第7章-文件和IO_第4頁
Python程序設計第7章-文件和IO_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

2024/11/24第7章文件和I/O主講人:目錄2024/11/2421.文件基礎知識2.文件操作3.目錄操作2024/11/24概述本章要解決的問題如下:什么是文件怎樣操作文件怎樣操作目錄2024/11/241.文件基礎知識1.1什么是文件文件是存儲在外部介質(zhì)上的數(shù)據(jù)集合,與文件名相關聯(lián)。按文件中的數(shù)據(jù)組織形式可以把文件分為兩類:文本文件二進制文件2024/11/241.文件基礎知識1.2文件的打開或創(chuàng)建文件變量名=open(文件名[,打開方式[,緩沖區(qū)]])示例如下:f1=open('file1.txt','r')f2=open('file2.txt','w')2024/11/241.文件基礎知識1.3字符編碼編碼是用數(shù)字來表示符號和文字的一種方式,是符號、文字存儲和顯示的基礎。信息傳遞與編碼關系的例子如右圖所示:2024/11/241.文件基礎知識常見的編碼UTF-8GB2312GBKCP936Unicode2024/11/241.文件基礎知識1.4文件的寫入1.文本文件的寫入以下兩種方法可以進行文本文件的寫入。write(str):將字符串str寫入文件。writelines(sequence_of_strings):寫多行到文件,其中sequence_of_strings是由字符串所組成的列表,或者迭代器。2024/11/241.文件基礎知識文件的寫過程與存儲如下圖:2024/11/241.文件基礎知識示例把字符串“重慶郵電大學123@cqupt”寫入文件F7_1.txt中,采用GBK編碼,顯示文件的長度(總字節(jié)),默認采用的是GBK編碼。2024/11/241.文件基礎知識程序#Exp7_1.py#coding=GBKf=open('F7_1.txt','w')f.write('重慶郵電大學123@cqupt')f.seek(0,2) #把文件指針移到文件尾length=f.tell()#會返回文件尾的位置,其值剛好等于文件長度f.close()print('文件長度=',length)程序運行結果文件長度=212024/11/241.文件基礎知識示例在Windows系統(tǒng)中,把字符串“重慶郵電大學123@cqupt”用UTF-8編碼寫入文件F7_2.txt中,并顯示文件的長度(總字節(jié)數(shù))。2024/11/241.文件基礎知識程序importcodecs #自然語言編碼轉(zhuǎn)換模塊#Exp7_2.py#coding=UTF-8s='重慶郵電大學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)程序運行結果文件長度=272024/11/241.文件基礎知識示例在文件F7_2.txt末尾追加兩行內(nèi)容。#Exp7_3.pyf=open('F7_2.txt','a+')s='重郵在山上\n重郵景色很美\n'f.write(s)f.close()2024/11/241.文件基礎知識2.二進制文件的寫入以下兩種方法可以進行二進制文件的寫入。一種是通過struct模塊的pack()方法把數(shù)字和布爾值轉(zhuǎn)換成字節(jié)串(以字節(jié)為單位的字符串),然后用write()方法寫入二進制文件中,字符串則可直接寫入二進制文件中。pack()方法的語法是:pack(格式串,數(shù)字對象表)。另外一種是用pickle模塊的dump()方法直接把對象轉(zhuǎn)換為字節(jié)串(bytes)并存入文件中。1.4文件的寫入2024/11/241.文件基礎知識示例把1個整數(shù)、1個浮點數(shù)、1個布爾型對象、1個字符串存入二進制文件F7_4.dat中。#Exp7_4.py#coding=UTF-8importstructn=102400000x=10.24b=Trues='重慶郵電大學123@cqupt'sn=struct.pack('if?',n,x,b)#把整數(shù)n、浮點數(shù)x、布爾對象b依次轉(zhuǎn)換為字節(jié)串2024/11/241.文件基礎知識程序續(xù)f=open('F7_4.dat','wb')f.write(sn) #寫入字節(jié)串f.write(s) #字符串可直接寫入f.close()2024/11/241.文件基礎知識示例把1個整數(shù)、1個浮點數(shù)、1個字符串、1個列表、1個元組、1個集合、1個字典存入二進制文件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]]2024/11/241.文件基礎知識tu=(-5,10,8)coll={4,5,6}dic={'a':'apple','b':'banana','g':'grape','o':'orange'}try:pickle.dump(n,f)#表示后面將要寫入的數(shù)據(jù)個數(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()2024/11/241.文件基礎知識1.5文件的讀取1.文本文件的讀取read([size]):讀取文件,如果文件大于size個字節(jié),則只讀取size個字節(jié);如果小于size個字節(jié),則讀取完;如果不設置size,則默認讀取全部。readline([size]):讀取一行readlines([size]):讀取完文件2024/11/241.文件基礎知識示例讀取文件F7_1.txt的前8個字節(jié),并顯示:#Exp7_6.pyf=open('F7_1.txt','r')s=f.read(11)#讀取文件的前11個字節(jié)f.close()print('s=',s)print('字符串s的長度(字符個數(shù))=',len(s))程序運行結果s=重慶郵電大學123@c字符串s的長度(字符個數(shù))=112024/11/241.文件基礎知識示例讀取文件F7_1.txt的全部內(nèi)容,并顯示:#Exp7_7.pyf=open('F7_1.txt','r')s=f.read()#讀取文件全部內(nèi)容f.close()print('s=',s)程序運行結果s=重慶郵電大學123@cqupt2024/11/241.文件基礎知識示例使用readline()讀取文件F7_2.txt的每一行,并顯示:

#Exp7_8.pyf=open('F7_2.txt','r')whileTrue:line=f.readline()ifline=='':breakprint(line),#逗號不會產(chǎn)生換行符,但文件中有換行符,因此會換行f.close()程序運行結果重慶郵電大學123@cqupt重郵在山上重郵景色很美2024/11/241.文件基礎知識示例使用readlines()讀取文件F7_2.txt的每一行,并顯示:#Exp7_9.pyf=open('F7_2.txt','r')s=f.readlines()forlineins:print(line),#逗號不會產(chǎn)生換行符,但文件中有換行符,因此會換行f.close()程序運行結果重慶郵電大學123@cqupt重郵在山上重郵景色很美2024/11/241.文件基礎知識1.5文件的讀取2.二進制文件的讀取用struct模塊的pack()方法完成轉(zhuǎn)換而寫的文件,應該用read()方法讀出相應數(shù)據(jù)的字節(jié)串,然后通過代碼還原數(shù)據(jù)。字符串不用還原。用pickle模塊的dump()方法完成轉(zhuǎn)換而寫的文件,應該用pickle模塊的load()方法還原對象。2024/11/241.文件基礎知識1.5文件的讀?。?)使用read()方法字符串可以直接讀出,數(shù)字和布爾對象需要用struct模塊的unpack()方法還原。unpack()方法的語法是:unpack(格式串,字符串表)。2024/11/241.文件基礎知識讀取二進制文件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個整數(shù)、1個浮點數(shù)和1個布爾值,并返回元組。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)程序運行結果

(102400000,10.239999771118164,True)n=102400000x=10.239999771118164bl=Trues='重慶郵電大學123@cqupt'2024/11/241.文件基礎知識1.5文件的讀?。?)使用pickle模塊的load()方法pickle模塊的load(f)方法可以從二進制文件中讀取對象的字節(jié)串并還原對象,使用起來非常方便。參數(shù)f是文件對象,該方法返回還原后的對象。2024/11/241.文件基礎知識示例讀取二進制文件F7_5.dat中的數(shù)據(jù),并顯示:#Exp7_11.pyimportpicklef=open('F7_5.dat','rb')n=pickle.load(f) #讀取文件的數(shù)據(jù)個數(shù)i=0whilei<n:x=pickle.load(f)print(x)i=i+1f.close()10240000010.24程序運行結果中國人民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'}2024/11/241.文件基礎知識1.5文件的讀取3.文件指針的移動寫入文件后,必須打開才能讀取寫入的內(nèi)容。讀取文件后,無法再次讀取讀過的內(nèi)容。seek(n),其中n>=0,seek(0)表示文件指針移到文件頭;n>0時,表示移動到文件頭之后的位置,從任意位置讀取內(nèi)容時或從任意位置覆蓋內(nèi)容時需要這樣做。seek(0,2)表示把文件指針移到文件尾,在追加新內(nèi)容時需要這樣做。2024/11/241.文件基礎知識示例把文件F7_1.txt中的“大”替換為“小”,再把“1”替換為“9”,最后在文件末尾增加“軟件學院”。#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('軟件學院')#增加新內(nèi)容f.close()2024/11/241.文件基礎知識1.5文件的讀取4.文件的關閉

關閉文件的原因如下:將寫緩存同步到磁盤。操作系統(tǒng)每個進程打開文件的個數(shù)是有限的。如果打開文件數(shù)到了系統(tǒng)限制,再打開文件就會失敗。②最常用的方法就是,調(diào)用close()顯式地關閉文件。目錄2024/11/2421.文件基礎知識2.文件操作3.目錄操作2024/11/242.文件操作2.1常用的文件操作函數(shù)一般而言,文件的基本操作都需要os模塊和os.path模塊。2024/11/242.文件操作2.2文件的復制復制文件有以下兩種方式:可以用read()與write()方法來實現(xiàn)另外還可以用shutil模塊實現(xiàn)文件的復制,該模塊的copyfile()函數(shù)就可以實現(xiàn)文件的復制2024/11/242.文件操作示例編寫一個用來復制文件的函數(shù)。#Exp7_16.py#coding=GBKdefFileCopy(tar_File,res_File):#定義1個函數(shù)以完成文件的復制try:f=open(res_File,'rb')f2=open(tar_File,'wb')except:print('打開文件異常!')return-1s=f.read()f2.write(s)f.close()f2.close()return02024/11/242.文件操作示例用FileCopy()函數(shù)把文本文件F7_1.txt復制到文件F7_1_2.txt中,把二進制文件F7_9.dat復制到F7_9_2.dat中。#Exp7_17.pyfromExp7_16importimportFileCopy#導入文件Exp7_16.py的方法FileCopyFileCopy('F7_9_2.dat','F7_9.dat')#調(diào)用導入的FileCopy方法FileCopy('F7_1_2.txt','F7_1.txt')#調(diào)用導入的FileCopy方法2024/11/242.文件操作示例用shutil模塊實現(xiàn)7_17.py的功能。#Exp7_18.pyimportshutilshutil.copyfile('F7_9_2.dat','F7_9.dat')#復制文件F7_9.dat到F7_9_2.datshutil.copyfile('F7_1_2.txt','F7_1.txt')#復制文件F7_1.txt到F7_1_2.txt2024/11/242.文件操作2.3文件的刪除文件的刪除,需要調(diào)用os模塊的remove()函數(shù)實現(xiàn),我們使用os.path模塊的exists()函數(shù)來確保被刪除文件存在。示例如下:importos,os.pathfilename='test1.txt'file(filename,'w')ifos.path.exists(filename):#確認文件是否存在os.remove(filename)#如果存在則刪除else:print('%sdoesnotexist!'%filename)2024/11/242.文件操作2.4文件的重命名使用os模塊的rename()函數(shù)可實現(xiàn)對文件或者目錄的重命名。os.listdir(".") #列出當前目錄的所有文件os.rename("hi.txt","hello.txt") #重命名文件2024/11/242.文件操作示例問題描述:若當前目錄存在文件名為test1.txt的文件,將其重新命名為mytest1.txt,若mytest1.txt已存在,則給出是否需要繼續(xù)更名的提示。若不要,則提示更名不成功,退出程序;若要,則再次輸入更名信息,檢測新名是否已經(jīng)存在,不存在則執(zhí)行更名操作,輸出更名成功提示信息,若存在,則再次詢問是否更名。2024/11/242.文件操作#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: #更名不存在,則進行更名os.rename(filename,rename)print('重命名成功')else:print('需要更名的文件不存在!')程序運行結果['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__']2024/11/242.文件操作2.5文件的比較前面說明了文件內(nèi)容的查找統(tǒng)計與內(nèi)容的替換,這里將介紹如何利用difflib模塊實現(xiàn)對序列或文件的比較。2024/11/242.文件操作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]))程序運行結果insertcontextA[0:0]=contextB[0:3]=hiequalcontextA[0:5]=hellocontextB[3:8]=hellodeletecontextA[5:11]=worldcontextB[8:8]=目錄2024/11/2421.文件基礎知識2.文件操作3.目錄操作2024/11/243.目錄操作3.1目錄的創(chuàng)建(1)用mkdir(path)創(chuàng)建一個指定目錄。>>>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']2024/11/243.目錄操作3.1目錄的創(chuàng)建(2)用makedirs(path1/path2…)創(chuàng)建多個目錄。>>>os.mkdir('./Newdir/subdir')#試圖用mkdir創(chuàng)建兩級目錄:Newdir與下級目錄subdirTraceback(mostrecentcalllast):File"<stdin>",line1.in<module>FileNotFoundError:[WinError3]系統(tǒng)找不到指定的路徑。:'./Newdir/subdir'>>>os.makedirs('.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論