Python3萌新入門筆記(38)
這一篇教程,我們一起來了解對檔案的一些操作。
三、fileinput模組
在接觸新的模組之前,我們先來嘗試通過Python內建的函式open進行檔案的讀寫。
1、檔案的讀取
示例程式碼:
path = r'C:\Users\Administrator\Desktop\song\lyric.txt' # 設定讀取檔案的路徑 file = open(path, 'r') # 開啟檔案存入變數,‘r’(read)為只讀模式。 while True: # 迴圈 line = file.readline() # 讀取一行內容存入變數 if line: # 如果變數不是空值(末尾行為空值) print(line, end='') # 顯示輸出讀取結果,設定不換行輸出(文字的每一行都帶有換行符)。 else: # 否則 break # 結束迴圈 file.close() # 關閉檔案
在上方程式碼中,我們通過本地路徑讀取了一個文字檔案,並將內容逐行顯示輸出。
需要注意的是,讀取結束後要通過close()方法,將檔案物件關閉。
不過,關閉檔案物件的操作,很容易被忘記,並且,通過while迴圈讀取檔案的每一行感覺很麻煩。
接下來,我們通過for迴圈來讀取檔案內容,並且結合關鍵字with開啟檔案。
使用關鍵字with進行檔案的開啟操作,檔案物件會在語句塊執行結束後自動關閉。
示例程式碼:
path = r'C:\Users\Administrator\Desktop\song\lyric.txt' # 設定讀取檔案的路徑 with open(path, 'r') as file: # 結合with關鍵字開啟檔案並存入變數 for line in file: # 如果變數不是空值(末尾行為空值) print(line.replace('\n', '')) # 顯示輸出讀取結果,替換掉每行內容末尾的換行符。
2、檔案的建立\清空\寫入
開啟檔案時,指定模式為’w’(write),如果檔案不存在,則會建立;如果檔案存在,則會開啟後清空。
示例程式碼:
path = r'C:\Users\Administrator\Desktop\song\test.txt' with open(path, 'w') as file: # 建立檔案或清空檔案內容 file.write('小樓真的好帥好帥的!') # 寫入內容
注意:寫入內容時,如果需要換行需要顯式的加入換行符。
3、檔案的追加
開啟檔案時,指定模式為’a’(append),就能夠在檔案末尾追加內容;如果檔案不存在,則會建立。
示例程式碼:
path = r'C:\Users\Administrator\Desktop\song\lyric.txt' with open(path, 'a') as file: # 檔案追加內容 file.write('這是我很喜歡的一首歌!') # 檔案內容末尾寫入一行內容
4、覆蓋
開啟檔案時,指定模式為’r+’,能夠在開始位置寫入新內容,覆蓋同等字元數量的原內容。
注意:’+’表示可對檔案進行寫入或讀取,但不可單獨出現。
示例程式碼:(覆蓋)
path = r'C:\Users\Administrator\Desktop\song\test.txt' # 假設當前檔案內容為“abcde”。 with open(path, 'r+') as file: # 設定開啟模式為讀寫模式。 file.write('aaa') # 程式執行後,檔案內容變更為“aaade”。
這種模式下,也能夠實現追加。
示例程式碼:(追加)
path = r'C:\Users\Administrator\Desktop\song\test.txt' # 假設當前檔案內容為“abcde”。 with open(path, 'r+') as file: # 設定開啟模式為讀寫模式。 file.read() # 讀取至末尾 file.write('aaa') # 此時從讀取後的位置寫入內容,程式執行一次後,檔案內容變更為“abcdeaaa”。
上方程式碼中的read()方法,引數為整數,能夠讀取指定數量的字元,省略引數時,讀取全部檔案內容,並將讀寫指標停留在檔案內容的末尾。
write()方法從讀寫指標所在的位置開始寫入新的內容。
5、可讀追加
開啟檔案時,指定模式為’a+’,能夠在追加內容之後讀取檔案內容。
示例程式碼:
path = r'C:\Users\Administrator\Desktop\song\test.txt' # 假設當前檔案內容為“abcde”。 with open(path, 'a+') as file: # 設定開啟模式為讀寫模式。 file.write('aaa') # 在檔案末尾寫入內容,程式執行一次後,檔案內容變更為“abcdeaaa”。 file.flush() # 重新整理快取,將快取內容立即寫入檔案。 file.seek(0) # 移動檔案讀取指標到指定位置,0為檔案開始位置。 print(file.read()) # 顯示輸出結果為:abcdeaaa
注意:在檔案操作過程中(檔案未關閉),寫入的內容並未真正的寫入到檔案,而是儲存在快取中;所以,需要使用flush()方法重新整理快取,將檔案更新,才能夠讀取到檔案內容。
在上方程式碼中,除了重新整理快取的函式,還有seek()方法,用於將讀寫指標移動到指定的位置。
這裡將讀寫指標移動迴文件開始位置(因為寫入內容後停留在末尾的位置),從頭進行讀取。
6、可讀寫入
開啟檔案時,指定模式為’w+’,能夠在寫入檔案內容之後讀取檔案內容。
示例程式碼:
path = r'C:\Users\Administrator\Desktop\song\test.txt' # 假設當前檔案內容為“abcde”。 with open(path, 'w+') as file: # 開啟並清空檔案 file.write('aaa') # 寫入內容,程式執行後,檔案內容變更為“aaa”。 file.flush() file.seek(0) print(file.read()) # 顯示輸出結果為:aaa
接下來,我們一起來看一下fileinput模組包含的內容。
示例程式碼:
import fileinput print(fileinput.__all__)
通過模組的__all__特性,我們得到以下結果:
[‘input’, ‘close’, ‘nextfile’, ‘filename’, ‘lineno’, ‘filelineno’, ‘fileno’, ‘isfirstline’, ‘isstdin’, ‘FileInput’, ‘hook_compressed’, ‘hook_encoded’]
- input():獲取包含多個檔案的可迭代物件
- filename():獲取當前讀取檔案的名稱
- fileno():獲取檔案編號
- lineno():獲取當前已經讀取總行數
- filelineno():獲取當前讀取的行的行號
- isfirstline():檢查是否當前所讀取檔案的第一行
- isstdin():檢查是否從標準輸入中讀取的行
- nextfile():讀取下一個檔案
- close():關閉讀取的檔案物件
- hook_compressed:用於讀寫.gz .bz2 檔案
- hook_encoded(encoding):用於處理檔案編碼
讀取檔案往往不是簡單的讀取與寫入,fileinput模組提供的功能,能夠讓我們更靈活的進行檔案讀取。
下面這個例子,是對某一資料夾中的全部檔案進行讀取,並顯示輸出讀取結果。
通過這個例子,大家可以對fileinput模組中的常用方法進行了解。
示例程式碼:
import os, fileinput # 匯入需要使用的模組 path = r'C:\Users\Administrator\Desktop\song' + '\\' # 設定查詢的目標資料夾路徑 names = os.listdir(path) # 獲取到目標資料夾下所有的檔名稱 paths = [] # 建立路徑列表 for name in names: # 迴圈遍歷所有的檔名稱 paths.append(path + name) # 為路徑列表新增檔案路徑 files = fileinput.input(paths) # 獲取目標資料夾中所有檔案 for line in files: # 遍歷所有檔案 all_no = fileinput.lineno() # 獲取當前已被讀取的總行數 line_no = fileinput.filelineno() # 獲取當前檔案被讀取行的行號 if line_no == 10: # 如果當前檔案讀取到第10行 fileinput.nextfile() # 讀取下一個檔案 if fileinput.isfirstline(): # 檢查是否第一行 print(fileinput.filename()) # 顯示輸出當前讀取的檔名稱 if all_no >= 15: # 如果已被讀取的總行數達到15行 fileinput.close() # 關閉當前讀取的檔案 print(all_no, line_no, line.replace('\n', '')) # 顯示輸出已讀取的總行數、當前檔案被讀取行的行號和當前讀取的行內容
程式碼執行結果:
示例相關檔案下載:【點選下載】
在fileinput模組中,input()函式是最重要的函式,它有很多引數。
fileinput.input(files=None, inplace=False, backup=”, bufsize=0, mode=’r’, openhook=None)
- files:檔案或檔案列表
- inplace:指定是否將標準輸出結果寫入檔案,預設為False(不寫入)。
- backup:指定備份檔案的副檔名,預設為空值(不備份)。
- bufsize:指定緩衝區大小,預設為0(不緩衝)。
- mode:指定讀寫模式,預設為’r’(只讀)。
- openhook:控制開啟的全部檔案,例如編碼型別,預設為None。
本節知識點:
1、使用內建函式open()讀寫檔案。
2、fileinput模組
本節英文單詞與中文釋義:
1、no(No.):編號
2、hook:鉤子
3、compressed:壓縮
4、bak(back-up):備份
5、line:線/行列
6、read:讀取
7、write:寫入
8、song:歌曲
9、lyric:歌詞
10、inplace:原地
11、buf(buffer):緩衝
12、encoded:編碼
13、flush:沖掉
14、seek:尋找
15、first:第一個