Python fileinput模塊應(yīng)用詳解
一、簡介
說到fileinput,可能90%的碼農(nóng)表示沒用過,甚至沒有聽說過。
這不奇怪,因?yàn)樵趐ython界,既然open可以走天下,何必要fileinput呢?。
其為open方法的高級(jí)封裝:
fileinput模塊可以對(duì)一個(gè)或多個(gè)文件中的內(nèi)容進(jìn)行迭代、遍歷等操作。
該模塊的input()函數(shù)有點(diǎn)類似文件readlines()方法,區(qū)別在于:
前者是一個(gè)迭代對(duì)象,即每次只生成一行,需要用for循環(huán)迭代。
后者是一次性讀取所有行。在碰到大文件的讀取時(shí),前者無疑效率更高效。
用fileinput對(duì)文件進(jìn)行循環(huán)遍歷,格式化輸出,查找、替換等操作,非常方便。
二、常用函數(shù)
1、描述
fileinput.input() # 進(jìn)行讀取文件對(duì)象的初始化,返回能夠用于for循環(huán)遍歷的對(duì)象
# return FileInput(files, inplace, backup, mode=mode, openhook=openhook)
fileinput.filename() # 返回當(dāng)前文件的名稱
# return fileInput.filename()
fileinput.lineno() # 返回當(dāng)前已經(jīng)讀取的行的數(shù)量(或者序號(hào))
# return fileInput.lineno()
fileinput.filelineno() # 返回當(dāng)前讀取的行的行號(hào)
# return fileInput.filelineno()
fileinput.isfirstline() # 檢查當(dāng)前行是否是文件的第一行
# return fileInput.isfirstline()
fileinput.isstdin() # 判斷最后一行是否從stdin中讀取
# return fileInput.isstdin()
fileinput.close() # 關(guān)閉隊(duì)列,也是關(guān)閉文件
fileinput.nextfile() # 關(guān)閉當(dāng)前文件以使下次迭代將從下一個(gè)文件(如果存在)讀取第一行;不是從該文件讀取的行將不會(huì)被計(jì)入累計(jì)行數(shù)。直到下一個(gè)文件的第一行被讀取之后文件名才會(huì)改變。
# —>在第一行被讀取之前,此函數(shù)將不會(huì)生效;它不能被用來跳過第一個(gè)文件。
# —>在最后一個(gè)文件的最后一行被讀取之后,此函數(shù)將不再生效。
2、第一個(gè)程序
#!/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函數(shù)里面不傳入?yún)?shù),則,我們需要從命令行傳入文件路徑 print(line)
python demo02.py 1.txt 2.txt
三、函數(shù)參數(shù)
1、參數(shù)
我們使用input方法打開文件
fileinput.input(files=None, inplace=False, backup="", bufsize=0, *, mode="r", openhook=None)
參數(shù):
files
:默認(rèn)是stdin方式 ,傳入要打開的文件,可以傳入一個(gè)文件列表,打開多個(gè)文件inplace
:是否將標(biāo)準(zhǔn)輸出的結(jié)果寫回文件,默認(rèn)不取代backup
:備份文件的擴(kuò)展名,只指定擴(kuò)展名,如.bak。如果該文件的備份文件已存在,則會(huì)自動(dòng)覆蓋。bufsize
:緩沖區(qū)大小,默認(rèn)為0,如果文件很大,可以修改此參數(shù),一般默認(rèn)即可mode
: 讀寫模式,默認(rèn)為只讀openhook
:鉤子函數(shù), 該鉤子用于控制打開的所有文件,比如說編碼方式等,返回一個(gè)文件對(duì)象
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: # 讀取當(dāng)前目錄下,所有的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: # 讀取當(dāng)前目錄下,所有的txt文件,同時(shí)新建一個(gè)備份文件文件,可以不新建備份文件 for line in f: print(f"{fileinput.filename()} -> {line.strip()} | 第{fileinput.filelineno()}行 | 共讀取{fileinput.lineno()}行") # 在for循環(huán)里面的print內(nèi)容不會(huì)輸出到控制臺(tái)上,而是直接輸出到文件對(duì)應(yīng)的行里面
四、鉤子函數(shù)
在 fileinput.input() 中有一個(gè) openhook 的參數(shù),它支持用戶傳入自定義的對(duì)象讀取方法;
如果沒有傳入任何勾子,fileinput 默認(rèn)使用的是 open 函數(shù)
1、內(nèi)置函數(shù)
fileinput 內(nèi)置了兩種勾子
fileinput.hook_compressed(filename, mode)
使用 gzip 和 bz2 模塊透明地打開 gzip 和 bzip2 壓縮的文件(通過擴(kuò)展名 ‘.gz’ 和 ‘.bz2’ 來識(shí)別);
如果文件擴(kuò)展名不是 ‘.gz’ 或 ‘.bz2’,文件會(huì)以正常方式打開(即使用 open() 并且不帶任何解壓操作);
使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_compressed)
fileinput.hook_encoded(encoding, errors=None)
返回一個(gè)通過 open() 打開每個(gè)文件的鉤子,使用給定的 encoding 和 errors 來讀取文件。
使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_encoded(“utf-8”, “surrogateescape”))
2、自定義函數(shù)
我們定義一個(gè)鉤子函數(shù),來實(shí)現(xiàn)讀取網(wǎng)絡(luò)資源
#!/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) # 文件對(duì)象即為字符串流 with fileinput.input("http://www.baidu.com", openhook=getOnlineSource) as f: # 獲取對(duì)應(yīng)url中的資源,并輸出 for line in f: print(line) # 輸出每一行內(nèi)容,即,等于是輸出io流中的所有內(nèi)偶然
到此這篇關(guān)于Python fileinput庫應(yīng)用詳解的文章就介紹到這了,更多相關(guān)Python fileinput庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python字符串訪問與修改局部變量的實(shí)現(xiàn)代碼
這篇文章主要介紹了使用Python字符串訪問與修改局部變量,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Python正則表達(dá)式常用函數(shù)總結(jié)
這篇文章主要介紹了Python正則表達(dá)式常用函數(shù),結(jié)合實(shí)例形式總結(jié)分析了Python正則表達(dá)式常用函數(shù)功能、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-06-06如何將DataFrame數(shù)據(jù)寫入csv文件及讀取
在Python中進(jìn)行數(shù)據(jù)處理時(shí),經(jīng)常會(huì)用到CSV文件的讀寫操作,當(dāng)需要將list數(shù)據(jù)保存到CSV文件時(shí),可以使用內(nèi)置的csv模塊,若data是一個(gè)list,saveData函數(shù)能夠?qū)ist中每個(gè)元素存儲(chǔ)在CSV文件的一行,但需要注意的是,默認(rèn)情況下讀取出的CSV數(shù)據(jù)類型為str2024-09-09Python中inplace、subset參數(shù)的意義及說明
這篇文章主要介紹了Python中inplace、subset參數(shù)的意義及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08python傳參時(shí)一個(gè)星號(hào)和兩個(gè)星號(hào)的區(qū)別小結(jié)
在Python中,一個(gè)星號(hào)(*)和兩個(gè)星號(hào)(**)用于函數(shù)定義中的參數(shù)傳遞,本文主要介紹了python傳參時(shí)一個(gè)星號(hào)和兩個(gè)星號(hào)的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Python實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)生成excel報(bào)表的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)生成excel報(bào)表的方法,結(jié)合完整實(shí)例形式分析了Python連接、查詢mysql數(shù)據(jù)庫并導(dǎo)出Excel報(bào)表的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07