資源簡介 (共47張PPT)Python少兒編程第八章 永久存儲的文件目錄1.1打開和關(guān)閉文件1.2讀寫文件1.3定位文件1.4高大上的文件系統(tǒng)PART 01打開和關(guān)閉文件打開文件1.1Python使用內(nèi)置函數(shù)open()即可按照指定模式打開指定文件,并創(chuàng)建文件對象,其語法格式如下。open(filename[, mode])其中,filename表示文件名稱;mode表示文件的讀寫模式,缺省時為只讀模式。該函數(shù)返回一個文件對象。例如,以只讀模式打開一個名為“1.txt”的文件,可以用下面代碼實現(xiàn)。file = open('1.txt')其中,file為打開的文件對象,通過它可以對文件進(jìn)行讀寫操作。如果想要寫入文件,就需要在打開文件時指明文件的打開模式。Python中文件的打開模式有多種,具體表示方式如表8-1所示。打開文件1.1表8-1 文件打開模式打開文件1.1(1)以只讀模式“r”打開文件時,該文件必須已經(jīng)存在,否則拋出異常,且只能進(jìn)行讀取操作,打開時文件位置指針在文件的開頭。(2)以只寫模式“w”打開文件時,如文件不存在,則以指定的文件名新建文件。若打開的文件已經(jīng)存在,則新數(shù)據(jù)覆蓋原文件中的已有數(shù)據(jù),且只能進(jìn)行寫操作。(3)以追加模式“a”打開文件時,如果文件已存在,打開時文件位置指針在文件的末尾,也就是說,新數(shù)據(jù)將寫入到已有數(shù)據(jù)之后,如果文件不存在,則新建文件進(jìn)行寫入。(4)“r+”“w+”“a+”模式都是既可讀也可寫,只是“r+”與“r”一樣,文件必須已經(jīng)存在。(5)打開模式帶上“b”表示以二進(jìn)制文件格式進(jìn)行操作。關(guān)閉文件1.2在Python中,雖然文件會在程序退出后自動關(guān)閉,但考慮到數(shù)據(jù)的安全性,每次使用完文件后,都應(yīng)使用close()方法關(guān)閉文件,其語法格式如下。file.close()其中,file為文件對象。例如,以只寫模式打開一個名為“test.txt”的文件,然后關(guān)閉文件,可以用下面代碼實現(xiàn)。file = open('test.txt', 'w') #以只寫方式打開名為“test.txt”的文件file.close() #關(guān)閉文件with語句1.3Python中的with語句(上下文管理語句)用于對資源進(jìn)行訪問,保證不管處理過程中是否發(fā)生錯誤或異常,都會調(diào)用__exit__()方法,執(zhí)行規(guī)定的清理操作,釋放訪問的資源。它常用于文件操作、數(shù)據(jù)庫連接、網(wǎng)絡(luò)通信連接、多線程與多進(jìn)程同步時的鎖對象管理等場合,其語法格式如下。with context_expression [as target(s)]:with_body #執(zhí)行代碼其中,context_expression是一個需要執(zhí)行的表達(dá)式,返回一個對象;target(s)用于保存context_expression返回的對象,可以是一個或多個。例如,讀寫文件時,with語句的用法如下。with open(filename[, mode]) as file:with_body #通過文件對象讀寫文件的語句PART 02讀寫文件寫入文件2.1write()方法用于向文件中寫入指定字符串,其語法格式如下。file.write(str)其中,file表示文件對象,str表示要寫入文件的字符串。【例8-1】 生日備忘錄。【問題分析】 首先,以只寫模式打開文件(當(dāng)文件不存在時會創(chuàng)建文件);然后,向文件中寫入數(shù)據(jù),這里需要注意的是write()方法不會自動在字符串的末尾添加換行符,因此,當(dāng)輸入多行時,需要在write()語句中包含換行符;最后,關(guān)閉文件。1. write()方法寫入文件2.1【參考代碼】#以只寫模式打開名為“birthday.txt”的文件file = open('birthday.txt', 'w')#向文件中寫入字符串file.write('小藍(lán) 2011.01.01\n')file.write('小舞 2010.08.15\n')file.write('小明 2011.05.01\n')file.write('小紅 2010.12.24\n')file.close() #關(guān)閉文件1. write()方法寫入文件2.1【運行結(jié)果】 程序運行后,會在當(dāng)前工作目錄下生成一個名為“birthday.txt”的文件,打開該文件,可以看到數(shù)據(jù)成功寫入到了文件中,如圖8-1所示。圖8-1 “birthday.txt”文件的內(nèi)容1. write()方法寫入文件2.1writelines()方法用于向文件中寫入字符串序列,如一個字符串列表,其語法格式如下。file.writelines(sequence)其中,file表示文件對象,sequence表示寫入文件的字符串序列。【例8-2】 向生日備忘錄中追加生日信息。【問題分析】 要向文件中追加數(shù)據(jù),須使用追加模式“a”打開文件。使用writelines()方法寫入數(shù)據(jù)時,同樣不會自動在列表后添加換行符,須手動加入。這里使用with語句進(jìn)行文件操作。2. writelines()方法寫入文件2.12. writelines()方法【參考代碼】#定義列表并賦值birthday = ['小果 2010.10.01\n', '小玉 2010.09.09']#以追加模式打開“birthday.txt”的文件with open('birthday.txt', 'a') as file:file.writelines(birthday) #向文件中追加字符串列表寫入文件2.12. writelines()方法【運行結(jié)果】 程序運行后,會將數(shù)據(jù)追加到“birthday.txt”文件中,打開該文件,可以看到數(shù)據(jù)成功追加到了文件中,如圖8-2所示。圖8-2 追加數(shù)據(jù)后“birthday.txt”文件的內(nèi)容讀取文件2.2read()方法用于從文件中讀取指定的字節(jié)數(shù),其語法格式如下。file.read([size])其中,file表示文件對象;size表示從文件中讀取的字節(jié)數(shù),如果缺省或為負(fù),則讀取整個文件內(nèi)容。該方法以字符串形式返回從文件中讀取的內(nèi)容。1. read()方法讀取文件2.2【例8-3】 按字節(jié)讀取生日備忘錄。1. read()方法【參考代碼】#以只讀模式打開“birthday.txt”文件with open('birthday.txt', 'r') as file:line = file.read(14) #讀取前14個字節(jié)print(line) #輸出前14個字節(jié)print('*' * 20) #輸出20個*用于分隔content = file.read() #讀取文件中剩余的所有內(nèi)容print(content) #輸出文件中剩余的所有內(nèi)容讀取文件2.2【運行結(jié)果】 程序運行結(jié)果如圖8-3所示。1. read()方法圖8-3 例8-3程序運行結(jié)果【程序說明】 打開文件時,文件位置指針在文件的開頭,運行“l(fā)ine = file.read(14)”語句,就會從文件的開頭讀取14個字節(jié),由于第14個字節(jié)是一個換行符,而print()函數(shù)也會默認(rèn)換行,所以輸出“小藍(lán) 2011.01.01”和一個空行。當(dāng)執(zhí)行“content = file.read()”語句時,文件位置指針已經(jīng)在第14個字節(jié)處,因此,讀取了文件中剩余的所有內(nèi)容(不包括前14個字節(jié))。讀取文件2.2readline()方法用于從文件中讀取一行,包括換行符,其語法格式如下。file.readline([size])其中,file表示文件對象,size表示從文件中讀取的字節(jié)數(shù),如果缺省,則讀取整行。2. readline()方法讀取文件2.22. readline()方法【例8-4】 按行讀取生日備忘錄。【參考代碼】#以只讀模式打開“birthday.txt”文件with open('birthday.txt', 'r') as file:while True:line = file.readline() #讀取一行if line: #如果讀取的內(nèi)容不為空print(line, end='') #輸出一行else: #如果讀取的內(nèi)容為空break #退出循環(huán)讀取文件2.22. readline()方法【運行結(jié)果】 程序運行結(jié)果如圖8-4所示。圖8-4 例8-4程序運行結(jié)果【程序說明】 上述代碼中,循環(huán)按行讀取文件中的內(nèi)容,如果讀取的內(nèi)容為空,則說明文件位置指針已經(jīng)在文件的末尾了,此時退出循環(huán)。讀取文件2.2readlines()方法用于讀取所有行(直到結(jié)束符EOF)并返回列表,列表中每個元素為文件中的一行數(shù)據(jù),其語法格式如下。file.readlines()3. readlines()方法讀取文件2.23. readlines()方法【例8-5】 一次性讀取生日備忘錄。【參考代碼】#以只讀模式打開“birthday.txt”文件with open('birthday.txt', 'r') as file:content = file.readlines() #讀取所有行并返回列表print(content) #輸出列表for line in content: #遍歷列表print(line, end='') #輸出列表中的每個元素讀取文件2.23. readlines()方法【運行結(jié)果】 程序運行結(jié)果如圖8-5所示。圖8-5 例8-5程序運行結(jié)果讀取文件2.23. readlines()方法當(dāng)讀取的文件非常大時,一次性將內(nèi)容讀取到列表中會占用很大內(nèi)存,影響程序執(zhí)行速度。因此,可以將文件本身作為一個行序列進(jìn)行讀取,遍歷文件的所有行可直接用下面代碼實現(xiàn)。#以只讀模式打開“birthday.txt”文件with open('birthday.txt', 'r') as file:for line in file: #遍歷文件的所有行print(line, end='') #輸出每行讀取文件2.23. readlines()方法【例8-6】 統(tǒng)計2021年《政府工作報告》全文中出現(xiàn)次數(shù)前15的詞語。【問題分析】 詞語出現(xiàn)次數(shù)統(tǒng)計涉及對詞匯的統(tǒng)計(即詞頻統(tǒng)計),從思路上看,詞頻統(tǒng)計只是累加問題,即對文檔中每個詞語設(shè)計一個計數(shù)器,每出現(xiàn)一次,相關(guān)計數(shù)器加1。可以采用字典來解決詞頻統(tǒng)計問題,以“詞語”為鍵,“計數(shù)器”為值。中文字符之間沒有天然的分隔符,在進(jìn)行詞頻統(tǒng)計之前,需要對中文文本進(jìn)行分詞,此時,可使用jieba庫解決這個問題。【參考代碼】import jieba #導(dǎo)入jieba庫#以只讀模式打開文件并讀取文件內(nèi)容with open('2021年《政府工作報告》全文.txt', 'r') as file:content = file.read()讀取文件2.23. readlines()方法【參考代碼】(續(xù))words = jieba.lcut(content) #進(jìn)行分詞,將結(jié)果放入words列表中counts = {} #定義字典用于存儲詞語和計數(shù)器for word in words: #遍歷wordsif len(word) == 1: #排除單個字符的分詞結(jié)果continueelse:counts[word] = counts.get(word, 0) + 1 #計數(shù)器累加items = list(counts.items()) #將字典元素轉(zhuǎn)換為列表items.sort(key=lambda x:x[1], reverse=True) #根據(jù)計數(shù)降序排序for i in range(15): #輸出前15項word, count = items[i]print('{0:<10}{1:>5}'.format(word, count))讀取文件2.23. readlines()方法【運行結(jié)果】 程序運行結(jié)果如圖8-8所示。圖8-8 例8-6程序運行結(jié)果PART 03定位文件獲取當(dāng)前讀寫位置3.1在讀寫文件的過程中,如果想知道當(dāng)前文件位置指針的位置,可通過tell()方法來獲取,其語法格式如下。file.tell()該方法返回文件的當(dāng)前位置,即文件位置指針當(dāng)前位置,它是從文件頭開始的字節(jié)數(shù)。定位到指定位置3.2如果在讀寫文件的過程中,需要從指定位置開始讀寫操作,就可以使用seek()方法移動文件位置指針到指定位置,其語法格式如下。file.seek(offset[, from])其中,file表示文件對象;offset表示偏移量,即偏移的字節(jié)數(shù);from表示起始點,即偏移的參考點。from有3種取值:0代表“文件開始位置”,1代表“當(dāng)前位置”,2代表“文件末尾位置”。缺省時取0,當(dāng)取2時,offset為負(fù)值,表示文件位置指針從文件末尾向前移動。定位到指定位置3.2【例8-7】 讀取文件,統(tǒng)計并輸出文件內(nèi)容。【參考代碼】filename = input('請輸入文件名:') #輸入文件名#以只讀模式打開文件,并設(shè)置編碼方式為UTF-8with open(filename, 'r', encoding='UTF-8') as file:file.seek(0, 2) #指針移到文件末尾pos = file.tell() #獲取指針位置并賦給posfile.seek(0, 0) #指針移到文件開頭content = file.read(pos) #讀取pos個字節(jié)的內(nèi)容#輸出字節(jié)數(shù)和內(nèi)容print('共{}個字節(jié),內(nèi)容如下。\n{}'.format(pos, content))【問題分析】 首先,打開指定的文件,文件名由鍵盤輸入;接著,使用seek()方法定位到文件末尾;然后,使用tell()方法返回文件位置指針當(dāng)前位置,即文件包含的字節(jié)數(shù);最后,使用seek()方法定位到文件開頭后,使用read()方法讀取文件內(nèi)容,并輸出字節(jié)數(shù)和文件內(nèi)容。定位到指定位置3.2【運行結(jié)果】 程序運行結(jié)果如圖8-9所示。圖8-9 例8-7程序運行結(jié)果PART 04高大上的文件系統(tǒng)os模塊4.1Python標(biāo)準(zhǔn)庫的os模塊除了提供使用操作系統(tǒng)功能和訪問文件系統(tǒng)的簡便方法外,還提供了大量文件操作的方法,常用的方法如表8-2所示。表8-2 os模塊的常用方法os模塊4.1表8-2 os模塊的常用方法(續(xù))os模塊4.1【例8-8】 創(chuàng)建文件夾,批量處理文件。【問題分析】 首先,使用mkdir()方法在當(dāng)前工作目錄下創(chuàng)建“語文”文件夾,并使用chdir()方法將工作目錄切換到“語文”文件夾中;接著,在該目錄下使用for循環(huán)以只寫模式打開文件方式批量生成文件;然后,刪除其中一個文件后,生成一個同名文件夾;最后,使用listdir()方法返回“語文”文件夾下的文件列表,并使用for循環(huán)遍歷文件列表,使用rename()方法重命名每個文件。其中,每次操作“語文”文件夾時,可通過輸出該文件夾下文件列表查看是否操作成功。os模塊4.1【參考代碼】import os #導(dǎo)入os模塊os.mkdir('語文') #創(chuàng)建“語文”文件夾os.chdir('語文') #將當(dāng)前目錄切換到“語文”文件夾中#創(chuàng)建文件名列表data_list = ['語法', '詩詞', '古文', '寫作', '外國文學(xué)']for data in data_list: #遍歷文件名列表filename = data + '.txt' #設(shè)置文件為txt文件file = open(filename, 'w') #創(chuàng)建文件file.close() #關(guān)閉文件path = os.getcwd() #獲取當(dāng)前目錄print(os.listdir(path)) #輸出文件列表os模塊4.1【參考代碼】(續(xù))os.remove(path + '\\外國文學(xué).txt') #刪除“外國文學(xué)”文件os.mkdir('外國文學(xué)') #創(chuàng)建“外國文學(xué)”文件夾file_name = os.listdir(path) #獲取當(dāng)前目錄下的文件和文件夾列表print(file_name) #輸出文件和文件夾列表i = 1for name in file_name: #遍歷列表if '.txt' in name: #如果為txt文件new_name = str(i) + name #在原文件名前加上數(shù)字進(jìn)行編號os.rename(name, new_name) #重命名文件i += 1 #i加1print(os.listdir(path)) #輸出文件和文件夾列表os模塊4.1【運行結(jié)果】 運行程序,“語文”文件夾下文件列表的變化如圖8-10所示。重命名后的文件視圖如圖8-11所示。圖8-10 “語文”文件夾下文件列表的變化os模塊4.1圖8-11 重命名后的文件視圖os.path模塊4.2os.path模塊提供了大量用于判斷路徑、獲取文件屬性的方法,常用的方法如表8-3所示。表8-2 os模塊的常用方法os.path模塊4.2例如:#導(dǎo)入os.path模塊import os.path#輸出絕對路徑,結(jié)果為“D:\PycharmProjects\第8章\語文”print(os.path.abspath('語文'))#查看文件是否存在,結(jié)果為Trueprint(os.path.exists('語文'))#分割目錄和文件名,結(jié)果為('D:\\PycharmProjects\\第8章', '語文')print(os.path.split('D:\\PycharmProjects\\第8章\\語文'))#分割文件名和擴(kuò)展名,結(jié)果為('例8-8', '.py')print(os.path.splitext('例8-8.py'))#查看文件大小,結(jié)果為1107print(os.path.getsize('例8-8.py'))shutil模塊4.3shutil模塊也提供了大量支持文件和文件夾操作的方法,常用的方法如表8-4所示。表8-4 shutil模塊的常用方法shutil模塊4.3【例8-9】 備份生日備忘錄。【問題分析】 使用copy()方法將生日備忘錄“birthday.txt”中的內(nèi)容復(fù)制到另一個文件“birthday_copy.txt”中。【參考代碼】import shutil #導(dǎo)入shutil模塊#復(fù)制文件內(nèi)容及權(quán)限shutil.copy('birthday.txt', 'birthday_copy.txt')shutil模塊4.3【運行結(jié)果】 程序運行后,“birthday_copy.txt”文件的內(nèi)容如圖8-12所示。圖8-12 “birthday_copy.txt”文件的內(nèi)容感謝觀看 展開更多...... 收起↑ 資源預(yù)覽 縮略圖、資源來源于二一教育資源庫