前言
之前介紹Python的 pathlib 模塊可以有效的路徑及文件查找等方便操作,本篇介紹一個相對 readlines() 獲取文件內容更高效的用法
fileinput模塊
對一個或者多個文件的內容迭代遍歷(類似文件操作的readlines()),但是返回的是
迭代對象
,而不是一次性返回所有的文件內容行記錄。
1、用法介紹
fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)
- • files 是要操作的文件列表,多文件格式爲 ['f1.txt', 'f2.txt'],
默認是標準輸入
- • inplace 是否將處理的結果
寫回文件
,默認是不寫回 - • backup 是否開啓備份,開啓的時候,只需要
指定備份的擴展名即可
,如果備份已經存在則會覆蓋 - • mode 讀寫的模式,默認是隻讀
- • encoding 文件編碼
2、常用到的函數
- • fileinput.input() 返回迭代對象,使用for循環讀取。可以配合 with 使用
- • fileinput.filename() 返回當前文件名稱
- • fileinput.lineno() 返回當前已經讀取的
行的數量
注意和 filelineno的區別 - • fileinput.filelineno() 返回單籤讀取的行的行號
- • fileinput.isfirstline() 檢查單籤行是否是文件的第一行
- • fileinput.isstdin() 判斷
最後一行
是否從標準stdin中讀取 - • fileinput.close() 關閉文件,配置with使用的時候,不需要顯著關閉
3、案例demo
3.1、 基於標準輸入和命令行文件參數
#!/usr/bin/env python# encoding: utf-8#import fileinputdef demo1(): """演示基於標準輸入""" print("文件名| 文件行號|文件行內容") for line in fileinput.input(): print(f"{fileinput.filename()}| {fileinput.filelineno()} | {line}") print(f"文件共有 {fileinput.lineno()} 行")if __name__ == '__main__': demo1()
命令行不加任何參數,表示從標準輸入 stdin 獲取信息
<figcaption style="text-align: center; line-height: 1.75; color: rgb(136, 136, 136); font-size: 0.8em;">image-20221209170647696</figcaption>
命令行有參數(文件)則讀取文件內容
<figcaption style="text-align: center; line-height: 1.75; color: rgb(136, 136, 136); font-size: 0.8em;">image-20221209170923786</figcaption>
3.2、修改多個文件,並回寫
到源文件
def demo2(): """ 演示多文件操作,並原地修改(寫回當前文件) """ # 直接傳參 # for line in fileinput.input(['fi_1.txt', 'fi_2.txt'], inplace=1): # 從命令行讀取(標準輸入) for line in fileinput.input(inplace=1): print(line.strip() + ' -> 我是回寫')
<figcaption style="text-align: center; line-height: 1.75; color: rgb(136, 136, 136); font-size: 0.8em;">image-20221209172108029</figcaption>
3.3、文件內容替換,並備份原文件
def demo3(): """實現源文件的內容替換,並實現備份""" for line in fileinput.input('1209_demo.txt', backup=".bak", inplace=1): print(line.rstrip().replace('Python', 'Django'))
執行腳本之後,發現 1209_demo.txt 文件中第一行的Python
變成了Django
# python demo_fileinput.py# cat 1209_demo.txthello Django in line one
3.4、利用``fileinput + re` 實現郵箱提取
def demo4(): pattern = "[a-zA-Z0-9]{3,9}@126.com" for line in fileinput.input("1209_demo.txt"): if re.search(pattern, line): print("Email: ", line)
執行腳本之後
# python demo_fileinput.pyEmail: [email protected]: [email protected]
Demo演示就到這裏,通過案例學習它的方法怎麼用,然後具體結合自己業務就好。
有問題,歡迎交流 ~