《Python大數(shù)據(jù)基礎與實戰(zhàn)》課件-Python大數(shù)據(jù)基礎與實戰(zhàn)(第9章 文件操作)_第1頁
《Python大數(shù)據(jù)基礎與實戰(zhàn)》課件-Python大數(shù)據(jù)基礎與實戰(zhàn)(第9章 文件操作)_第2頁
《Python大數(shù)據(jù)基礎與實戰(zhàn)》課件-Python大數(shù)據(jù)基礎與實戰(zhàn)(第9章 文件操作)_第3頁
《Python大數(shù)據(jù)基礎與實戰(zhàn)》課件-Python大數(shù)據(jù)基礎與實戰(zhàn)(第9章 文件操作)_第4頁
《Python大數(shù)據(jù)基礎與實戰(zhàn)》課件-Python大數(shù)據(jù)基礎與實戰(zhàn)(第9章 文件操作)_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第九章文件操作9.5目錄的操作9.4文件的操作9.2文本文件的讀寫9.6案例實戰(zhàn)9.3二進制文件的讀寫9.1文件的打開和關閉

為了長期保存數(shù)據(jù)以便重復使用、修改和共享,必須將數(shù)據(jù)以文件的形式存儲到外部存儲介質(zhì)(如磁盤、U盤、光盤或云盤、網(wǎng)盤、快盤等)中。文件操作在各類應用軟件的開發(fā)中均占有重要的地位:管理信息系統(tǒng)是使用數(shù)據(jù)庫來存儲數(shù)據(jù)的,而數(shù)據(jù)庫最終還是要以文件的形式存儲到硬盤或其他存儲介質(zhì)上。應用程序的配置信息往往也是使用文件來存儲的,圖形、圖像、音頻、視頻、可執(zhí)行文件等等也都是以文件的形式存儲在磁盤上的。9.1文件的打開和關閉9.1文件的打開和關閉為了長期保存數(shù)據(jù)以便重復使用、修改和共享,必須將數(shù)據(jù)以文件的形式存儲到外部存儲介質(zhì)中。文件操作在各類應用軟件的開發(fā)中占有重要的地位。按文件中數(shù)據(jù)的組織形式把文件分為文本文件和二進制文件兩類。文本文件:存儲的是常規(guī)字符串,由若干文本行組成,每行以換行符“\n”結尾??梢允褂梦谋揪庉嬈鬟M行顯示、編輯并且能夠直接閱讀。如網(wǎng)頁文件、記事本文件、程序源代碼文件等。二進制文件:存儲的是字節(jié)串bytes,需要使用專門的軟件進行解碼后才能讀取、顯示、修改或執(zhí)行。如圖形圖像文件、音視頻文件、可執(zhí)行文件、數(shù)據(jù)庫文件等。9.1文件的打開和關閉Python使用open()方法用于打開一個文件,并返回一個可迭代的文件對象,通過該文件對象可以對文件進行讀寫操作。如果文件不存在、訪問權限不夠、磁盤空間不足或其它原因?qū)е聞?chuàng)建文件對象失敗,open()函數(shù)就會拋出一個IOError的錯誤,并且給出錯誤碼和詳細的信息。open()函數(shù)常用形式是接收兩個參數(shù):文件名(file)和模式(mode)。fileobject=open(filename[,mode='r'][,buffering=-1][,encoding])參數(shù)的說明如下:filename:要訪問的文件名稱。mode:指定打開文件后的處理方式:只讀,寫入,追加等。所有可能取值見表11-1所示。這個參數(shù)是非強制的,默認文件訪問模式為只讀(r)。buffering:0表示不緩存,1表示緩存。大于1表示緩沖區(qū)的大小。-1表示緩沖區(qū)的大小為系統(tǒng)默認值。encoding:指定對文本進行編碼和解碼的方式,只適用于文本模式,可以使用Python支持的任何格式,如gbk、utf8、cp936等。9.1文件的打開和關閉9.1.2文件的模式Python打開文件可以有多種模式(mode),讀模式、寫模式、追加模式等,具體說明見下表。訪問模式描述r默認模式,以只讀方式打開文本文件,文件的指針將會放在文件的開頭。w打開一個文本文件用于寫入。如果該文件已存在則將其覆蓋;如果該文件不存在,則創(chuàng)建新文件。a打開一個文本文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內(nèi)容將會被寫入到已有內(nèi)容之后;如果該文件不存在,則創(chuàng)建新文件進行寫入。rb打開一個二進制文件用于只讀,文件指針將會放在文件的開頭。wb打開一個二進制文件只用于寫入。如果該文件已存在則將其覆蓋;如果該文件不存在,則創(chuàng)建新文件。9.1文件的打開和關閉9.1.3文件的關閉close()

方法用于關閉一個已打開的文件,可以將緩沖的數(shù)據(jù)寫入文件,然后關閉文件。關閉后的文件不能再進行讀寫操作,否則會觸發(fā)

ValueError

錯誤。close()方法允許調(diào)用多次。而flush()方法將緩沖的數(shù)據(jù)寫入文件,但是不關閉文件。需要注意的是,即使寫了關閉文件的代碼,也無法保證文件一定能夠正常關閉。例如,如果在打開文件之后和關閉文件之前發(fā)生了錯誤導致程序崩潰,這是文件就無法正常關閉。所以,在管理文件對象時推薦使用with關鍵字,可以有效避免這個問題。文件在讀寫結束后會自動關閉,即使是異常引起的結束也是如此。9.1文件的打開和關閉上下文管理器with語句的用法如下:withopen(filename,mode,encoding)asfp:使用with語句的好處:使用with自動關閉資源,可以在代碼塊執(zhí)行完畢后還原進入該代碼塊時的現(xiàn)場。不論何種原因跳出with塊,不論是否發(fā)生異常,總能保證文件被正確關閉,資源被正確釋放。9.2文本文件的讀寫9.2文本文件的讀寫9.2.1寫文件1.write()write(s)

方法用于向一個打開的文件中寫入指定的字符串。在文件關閉前或緩沖區(qū)刷新前,字符串內(nèi)容存儲在緩沖區(qū)中,這時在文件中是看不到寫入的內(nèi)容的。需要重點注意的是,write()方法不會在字符串的結尾添加換行符“\n”。write()方法語法格式如下:fileObject.write(str)參數(shù)str:要寫入文件的字符串。返回值:返回的是寫入的字符長度。在操作文件時,每調(diào)用一次write()方法,寫入的數(shù)據(jù)就會追加到文件末尾。9.2文本文件的讀寫fp=open("test.txt","w") #以只寫方式打開文本文件fp.write("MynameisGuidovanRossum!\n")fp.write("IinventedthePythonprogramminglanguage!\n")fp.write("IlovePython!\n")fp.close()程序運行后,會在程序當前的路徑下,生成一個名為test.txt文件,打開該文件,可以看到數(shù)據(jù)成功被寫入,test.txt文件內(nèi)容如下:MynameisGuidovanRossum!IinventedthePythonprogramminglanguage!IlovePython!注意:當向文件寫入數(shù)據(jù)時,如果文件不存在,那么系統(tǒng)會自動創(chuàng)建一個文件并寫入數(shù)據(jù)。如果文件存在,那么會清空原來文件的數(shù)據(jù),重新寫入新數(shù)據(jù)。9.2文本文件的讀寫2.writelines()writelines()方法把字符串列表寫入文本文件,不添加換行符“\n”。示例如下:#讀取文本文件data.txt中的所有整數(shù),并按照升序排序后寫入文本文件data_desc.txt中withopen("data.txt","r")asfp:data=fp.readlines()data=[int(line.strip())forlineindata] #提取每行的數(shù)據(jù)data.sort(reverse=True) #原地排序data=[str(i)+"\n"foriindata] #生成要寫入的列表內(nèi)容withopen("data_desc.txt","w")asfp:fp.writelines(data)9.2文本文件的讀寫9.2.2讀文件Python文件對象提供了三個“讀”方法:read()、readline()和readlines()。每種方法可以接受一個變量以限制每次讀取的數(shù)據(jù)數(shù)量。1.read()

read()方法從文件當前位置起讀取size個字符串,若無參數(shù)size,則表示讀取至文件結束為止。如果使用多次,那么后面讀取的數(shù)據(jù)是從上次讀完后的位置開始。read()語法結構如下:fileObject.read(size)參數(shù)size

:從文件中讀取的字符數(shù)。如果沒有指定字符數(shù),那么就表示讀取文件的全部內(nèi)容。返回值:返回從字符串中讀取的字符內(nèi)容。9.2文本文件的讀寫fp=open("test.txt","r") #只讀方式打開文本文件content=fp.read(10)#讀取10個字節(jié)數(shù)據(jù)print(content)運行結果如下:Mynameis2.readline()該方法每次讀出一行內(nèi)容,該方法讀取時占用內(nèi)存小,比較適合大文件,該方法返回一個字符串對象。readline([)語法如下:fileObject.readline()返回值:返回讀取的字符串。9.2文本文件的讀寫下面通過一個案例來演示readline()方法。fp=open("test.txt","r") #只讀方式打開文件line=fp.readline()print("讀取第一行:%s"%(line))print("----------------------華麗的分割線----------------")whileline: #循環(huán)讀取每一行print(line)line=fp.readline()fp.close()print("文件",,"已經(jīng)成功分行讀出!")9.2文本文件的讀寫3.readlines()readlines()方法讀取文件的所有行,保存在一個列表中,每行作為一個元素,但讀取大文件會比較占內(nèi)存。該列表可以由Python的for...in...結構進行處理。readlines()語法:fileObject.readlines()返回值:此方法返回包含所有行的列表。9.2文本文件的讀寫lines=f.readlines()print("行的數(shù)據(jù)類型:",type(lines))print(("列表形式存放每一行:%s"%(lines)))print("----------------------分割線----------------")forlineinlines:#依次讀取每行l(wèi)ine=line.strip() #去掉每行頭尾空白符,包括'\n'print("讀取的數(shù)據(jù)為:%s"%(line))f.close()print("文件",,"已經(jīng)成功把所有行讀出!")9.3二進制文件的讀寫9.3二進制文件的讀寫二進制文件讀寫的是bytes字節(jié)串。示例如下:withopen("test.bt","wb")asfp: fp.write("abcd") #產(chǎn)生異常,需要轉(zhuǎn)換成bytes運行該程序,由于寫入的是一個字符串,非字節(jié)串,系統(tǒng)會拋出異常,信息如下:TypeErrorTraceback(mostrecentcalllast)TypeError:abytes-likeobjectisrequired,not'str'9.3二進制文件的讀寫修改程序如下:withopen("test.bt","wb+")asfp:

fp.write(bytes("我愛中國".encode("utf-8")))#轉(zhuǎn)換成使用utf-8編碼

fp.seek(0) #文件指針定位到開頭

b=fp.read().decode("utf-8") #解碼方式和編碼方式要一致

print(b)運行結果如下:我愛中國

#正確輸出可以看出如果直接用文本文件或二進制文件格式存儲Python中的各種對象,通常需要進行繁瑣的轉(zhuǎn)換。9.3二進制文件的讀寫Python提供標準模塊pickle用來處理文件中對象的讀寫。用文件來存儲程序中的各種對對象稱為對象的序列化。示例如下:importpickle

#導入pickle模塊name="張三" age=20scores=[65,70,76,80]withopen("test.bt","wb+")asfp: #以讀寫方式打開二進制文件

pickle.dump(name,fp) #寫入文件pickle.dump(age,fp)pickle.dump(scores,fp)

9.3二進制文件的讀寫

fp.seek(0) #將文件指針移動到文件開頭print(fp.read()) #讀出文件的全部內(nèi)容,返回一個字節(jié)串fp.seek(0) name=pickle.load(fp)

#讀取文件age=pickle.load(fp)scores=pickle.load(fp)print(name,";",age,";",scores)運行結果如下:b'\x80\x03X\x06\x00\x00\x00\xe5\xbc\xa0\xe4\xb8\x89q\x00.\x80\x03K\x14.\x80\x03]q\x00(KAKFKLKPe.'張三;20;[65,70,76,80]9.4文件的操作

9.4文件的操作os模塊除了提供使用操作系統(tǒng)功能和訪問文件系統(tǒng)的簡便方法外,還提供了大量文件和目錄操作的方法。1、文件的重命名os.rename()方法用于重命名文件或目錄,如果dst是一個存在的目錄,將拋出OSError。rename()方法的語法格式如下:os.rename(src,dst);參數(shù):src

是要修改的目錄名dst

是修改后的目錄名,返回值:該方法沒有返回值2、文件的刪除os.remove()方法用于刪除指定路徑的文件。如果指定的路徑是一個目錄,將拋出OSError。remove()方法語法格式:os.remove(path)參數(shù):path

是要移除的文件路徑返回值:該方法沒有返回值

9.4文件的操作下面通過一個案例來演示rename()和remove()方法的應用。importos #導入os包print("目錄為:%s"%os.listdir(os.getcwd())) #列出當前目錄下的文件和子目錄os.rename("test.txt","test1.txt") #重命名文件print("重命名成功!")print("重命名后目錄為:%s"%os.listdir(os.getcwd()))os.remove("test1.txt")print("刪除成功!")print("刪除后目錄為:%s"%os.listdir(os.getcwd()))

9.4文件的操作3、判斷是否是文件os.path.isfile(path)方法判斷path是否是一個文件,返回值是True或者False。4、文件的復制shutil.copy(src.dst)方法將文件src復制到文件或目錄dst中,該函數(shù)返回目標文件名。5、檢查文件是否存在os.path.exists(path)方法用于檢查文件的存在性,返回一個布爾值。6、獲取絕對路徑名os.path.abspath(path)方法返回path的絕對路徑名。

9.4文件的操作示例如下:ifnotos.path.exists(r".\1.py"): #當前目錄下1.py文件不存在withopen(r".\1.py","w")asfp: #創(chuàng)建1.py文件fp.write("print('helloworld!')\n")filename=shutil.copy(r".\1.py","d:\\data") #復制1.py到d:\data目錄下print(os.path.abspath("1.py")) #打印1.py文件所在的絕對路徑9.5

目錄的操作

9.5目錄的操作在實際開發(fā)中,有時需要用程序的方式文件夾進行一定的操作。比如創(chuàng)建、刪除、顯示目錄內(nèi)容等,可以通過os和os.path模塊提供的方法來完成。1、創(chuàng)建文件夾os.mkdir(path)方法用于創(chuàng)建目錄,目錄存在時會拋出FileExistsError異常。2、獲取當前目錄os.getcwd()返回當前工作目錄。3、改變默認目錄os.chdir(path)改變當前工作目錄。4、獲取目錄內(nèi)容os.listdir(path)返回path指定的目錄下包含的文件或子目錄的名字列表。

9.5目錄的操作5、刪除目錄os.rmdir(path)刪除path指定的目錄,如果目錄非空,則拋出一個OSError異常。6、判斷是否為目錄os.path.isdir(path)方法用于判斷path是否為目錄,返回一個布爾值。7、連接多個目錄os.path.join(path,*paths)方法連接兩個或多個path,形成一個完整的目錄。8、分割路徑os.path.split(path)方法對路徑進行分割,以元組方式進行返回;os.path.splitext(path)方法從路徑中分割文件的擴展名;os.path.splitdrive(path)從路徑中分割驅(qū)動器名稱。9、獲取路徑os.path.abspath(path)方法返回path的絕對路徑;os.path.dirname(path)返回path的路徑名部分。

9.5目錄的操作下面通過一個例子,演示文件夾的相關操作,該例子編寫一個批量修改文件和目錄名的小程序。程序?qū)崿F(xiàn)文件和目錄名前加上Python-前綴。importos #導入os模塊folderName='./renameDir/'dirList=os.listdir(folderName) #獲取指定路徑下所有文件和子目錄的名字fornameindirList: #遍歷輸出所有文件和子目錄的名字print("修改前文件名:",name)newName='Python-'+nameprint("修改后文件名:",newName)os.rename(os.path.join(folderName,name),os.path.join(folderName,newName))9.6

案例實戰(zhàn)

8.6案例實戰(zhàn)1.案例描述編寫程序,統(tǒng)計指定目錄下所有的Python源代碼文件中不重復的代碼行數(shù)。只考慮擴展名為.py,并且嚴格相等的兩行視為重復行。2.案例實現(xiàn)統(tǒng)計不重復的代碼行數(shù)fromos.pathimportisdir,join,isfilefromosimportlistdir

allLines=[] #保存所有代碼行notRepeatedLines=[] #保存不重復的代碼行fileNum=0 #文件的數(shù)量codeNum=0 #代碼總行數(shù)8.6案例實戰(zhàn)defgetLinesCount(directory):globalallLinesglobalnotRepeatLines

溫馨提示

  • 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

提交評論