網站首頁 編程語言 正文
一、簡介
說到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
相關推薦
- 2022-06-22 詳解Linux下find查找文件命令和grep查找文件命令_linux shell
- 2022-07-12 Linux虛擬機設置雙網卡
- 2022-07-19 圖片打包加載出錯
- 2023-06-19 Python進行文件處理的示例詳解_python
- 2022-03-25 C語言中字符型數據和浮點型數據介紹_C 語言
- 2022-07-22 SpringBoot允許跨域訪問配置
- 2022-10-15 QT?UDP網絡編程實現簡單消息傳輸_C 語言
- 2023-01-28 C#實現繪制鼠標的示例代碼_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支