1. 程式人生 > >Python3萌新入門筆記(38)

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:第一個