Python模塊fileinput操作文件和目錄操作總結

前言

之前介紹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演示就到這裏,通過案例學習它的方法怎麼用,然後具體結合自己業務就好。

有問題,歡迎交流 ~


原文地址 Python模塊fileinput操作文件和目錄操作總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章