日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python?fileinput模塊應用詳解_python

作者:A-L-Kun ? 更新時間: 2022-11-13 編程語言

一、簡介

說到fileinput,可能90%的碼農表示沒用過,甚至沒有聽說過。

這不奇怪,因為在python界,既然open可以走天下,何必要fileinput呢?。

其為open方法的高級封裝:

fileinput模塊可以對一個或多個文件中的內容進行迭代、遍歷等操作。

該模塊的input()函數有點類似文件readlines()方法,區別在于:

前者是一個迭代對象,即每次只生成一行,需要用for循環迭代。

后者是一次性讀取所有行。在碰到大文件的讀取時,前者無疑效率更高效。

用fileinput對文件進行循環遍歷,格式化輸出,查找、替換等操作,非常方便。

二、常用函數

1、描述

fileinput.input() ? ? ? # 進行讀取文件對象的初始化,返回能夠用于for循環遍歷的對象
# return FileInput(files, inplace, backup, mode=mode, openhook=openhook)
fileinput.filename() ? ?# 返回當前文件的名稱
# return fileInput.filename()
fileinput.lineno() ? ? ?# 返回當前已經讀取的行的數量(或者序號)
# return fileInput.lineno()
fileinput.filelineno() ?# 返回當前讀取的行的行號
# return fileInput.filelineno()
fileinput.isfirstline() # 檢查當前行是否是文件的第一行
# return fileInput.isfirstline()
fileinput.isstdin() ? ? # 判斷最后一行是否從stdin中讀取
# return fileInput.isstdin()
fileinput.close() ? ? ? # 關閉隊列,也是關閉文件

fileinput.nextfile() ?# 關閉當前文件以使下次迭代將從下一個文件(如果存在)讀取第一行;不是從該文件讀取的行將不會被計入累計行數。直到下一個文件的第一行被讀取之后文件名才會改變。
# —>在第一行被讀取之前,此函數將不會生效;它不能被用來跳過第一個文件。
# —>在最后一個文件的最后一行被讀取之后,此函數將不再生效。

2、第一個程序

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "liu.zhong.kun@foxmail.com"
import fileinput
# 典型用法
for line in fileinput.input():  # 如果input函數里面不傳入參數,則,我們需要從命令行傳入文件路徑
    print(line)

python demo02.py 1.txt 2.txt

三、函數參數

1、參數

我們使用input方法打開文件

fileinput.input(files=None, inplace=False, backup="", bufsize=0, *, mode="r", openhook=None)

參數:

  • files:默認是stdin方式 ,傳入要打開的文件,可以傳入一個文件列表,打開多個文件
  • inplace:是否將標準輸出的結果寫回文件,默認不取代
  • backup:備份文件的擴展名,只指定擴展名,如.bak。如果該文件的備份文件已存在,則會自動覆蓋。
  • bufsize:緩沖區大小,默認為0,如果文件很大,可以修改此參數,一般默認即可
  • mode: 讀寫模式,默認為只讀
  • openhook:鉤子函數, 該鉤子用于控制打開的所有文件,比如說編碼方式等,返回一個文件對象

2、批量處理

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "liu.zhong.kun@foxmail.com"
import fileinput
from glob import glob  # 使用正則匹配文件
with fileinput.input(files=glob("*.txt"), openhook=fileinput.hook_encoded("utf-8")) as f:  # 讀取當前目錄下,所有的txt文件
    for line in f:
        print(f"{fileinput.filename()} -> {line.strip()} | 第{fileinput.filelineno()}行 | 共讀取{fileinput.lineno()}行")

3、修改備份

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "liu.zhong.kun@foxmail.com"
import fileinput
from glob import glob  # 使用正則匹配文件
with fileinput.input(files=glob("*.txt"), inplace=True, backup=".bak") as f:  # 讀取當前目錄下,所有的txt文件,同時新建一個備份文件文件,可以不新建備份文件
    for line in f:
        print(f"{fileinput.filename()} -> {line.strip()} | 第{fileinput.filelineno()}行 | 共讀取{fileinput.lineno()}行")  # 在for循環里面的print內容不會輸出到控制臺上,而是直接輸出到文件對應的行里面

四、鉤子函數

在 fileinput.input() 中有一個 openhook 的參數,它支持用戶傳入自定義的對象讀取方法;

如果沒有傳入任何勾子,fileinput 默認使用的是 open 函數

1、內置函數

fileinput 內置了兩種勾子

  • fileinput.hook_compressed(filename, mode)

使用 gzip 和 bz2 模塊透明地打開 gzip 和 bzip2 壓縮的文件(通過擴展名 ‘.gz’ 和 ‘.bz2’ 來識別);

如果文件擴展名不是 ‘.gz’ 或 ‘.bz2’,文件會以正常方式打開(即使用 open() 并且不帶任何解壓操作);

使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_compressed)

  • fileinput.hook_encoded(encoding, errors=None)

返回一個通過 open() 打開每個文件的鉤子,使用給定的 encoding 和 errors 來讀取文件。

使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_encoded(“utf-8”, “surrogateescape”))

2、自定義函數

我們定義一個鉤子函數,來實現讀取網絡資源

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "liu.zhong.kun@foxmail.com"
import fileinput
from glob import glob  # 使用正則匹配文件
from io import StringIO
from requests import get
def getOnlineSource(url, *args, **kwargs):
    resp = get(url)
    resp.encoding = resp.apparent_encoding
    return StringIO(resp.text)  # 文件對象即為字符串流
with fileinput.input("http://www.baidu.com", openhook=getOnlineSource) as f:  # 獲取對應url中的資源,并輸出
    for line in f:
        print(line)  # 輸出每一行內容,即,等于是輸出io流中的所有內偶然

原文鏈接:https://blog.csdn.net/qq_62789540/article/details/126034655

欄目分類
最近更新