




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Python實現讀取文件的方法總結目錄序言1、方法介紹2、默認讀取3、處理一個文件4、處理批量文件5、讀取與備份6、重定向替換7、進階總結
序言
哈嘍兄弟們,今天咱們來了解一下fileinput。
說到fileinput,可能90%的碼農表示沒用過,甚至沒有聽說過。
這不奇怪,因為在python界,既然open可以走天下,何必要fileinput呢?
但是,今天我還是要介紹fileinput這個方法,因為太奈斯了。
不止是香。是真香!
接下來,就跟著我,一起fileinput,對,就是這個feel。
1、方法介紹
基本用法
先來看一下fileinput的基本功能:
fileinput.filename():返回當前被讀取的文件名。
在第一行被讀取之前,返回None。
fileinput.fileno():返回以整數表示的當前文件文件描述符。
當未打開文件時(處在第一行和文件之間),返回-1。
fileinput.lineno():返回已被讀取的累計行號。
在第一行被讀取之前,返回0。在最后一個文件的最后一行被讀取之后,返回該行的行號。
fileinput.filelineno():返回當前文件中的行號。
在第一行被讀取之前,返回0。
在最后一個文件的最后一行被讀取之后,返回此文件中該行的行號。
進階用法
fileinput.isfirstline():如果剛讀取的行是其所在文件的第一行則返回True,否則返回False。
fileinput.isstdin():如果最后讀取的行來自sys.stdin則返回True,否則返回False。
fileinput.nextfile():關閉當前文件以使下次迭代將從下一個文件(如果存在)讀取第一行;不是從該文件讀取的行將不會被計入累計行數。直到下一個文件的第一行被讀取之后文件名才會改變。
在第一行被讀取之前,此函數將不會生效;它不能被用來跳過第一個文件。
在最后一個文件的最后一行被讀取之后,此函數將不再生效。
fileinput.close():關閉序列。
2、默認讀取
代碼示例
importfileinput
'當Python腳本沒有傳入任何參數時,fileinput默認會以stdin作為輸入源'
forlineinfileinput.input():
print(f'{line}')
運行結果
你輸入的內容,程序都會讀取并再輸出。
俗稱:復讀機
3、處理一個文件
代碼示例
importfileinput
'files輸入打開文件的名稱即可'
withfileinput.input(files=('output.txt',))asfile:
forlineinfile:
print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')
運行結果
解析:
fileinput有且僅有這兩種讀取模式:r,rb
fileinput.input()默認使用mode=r的模式讀取文件,如果你的文件是二進制的,可以使用mode=rb模式。
4、處理批量文件
多文件序號連續排序
調用方法
fileinput.lineno()方法
代碼示例
importfileinput
'files輸入打開文件的名稱即可'
withfileinput.input(files=('output.txt','input.txt'))asfile:
forlineinfile:
#fileinput.lineno()把兩個文件的整合陳一個文件對象file,需要排序輸出
print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')
#fileinput.filelineno()兩個文件單獨讀取,需要單獨排序
print(f'{fileinput.filename()}第{fileinput.filelineno()}行:{line}',end='')
運行結果
多文件序號單獨排序
調用方法
fileinput.filelineno()方法
代碼示例
importfileinput
'files輸入打開文件的名稱即可'
withfileinput.input(files=('test1.txt','test2.txt'))asfile:
forlineinfile:
#fileinput.filelineno()兩個文件單獨讀取,需要單獨排序
print(f'{fileinput.filename()}第{fileinput.filelineno()}行:{line}',end='')
運行結果
與glob配合用法
在顏值的時代,上面的輸出樣式,已經無法滿足我們的需要了,于是乎,我們就想到了glob。
代碼示例
importfileinput
importglob
#glob匹配te開頭的txt文件
forlineinfileinput.input(glob.glob("te*.txt")):
iffileinput.isfirstline():
#輸出讀取文件
print('='*10,f'讀取文件{fileinput.filename()}','='*10)
#fileinput.filelineno()方法讀取
print(str(fileinput.filelineno())+':'+line.upper(),end='')
運行結果
就這顏值,哪個小姐姐能不喜歡呢。
5、讀取與備份
調用方法
fileinput.input的backup參數,可以指定備份的后綴名,比如.bak
代碼示例
importfileinput
#觸發backup的動作,源文件內容被修改,對源文件進行backup
withfileinput.input(files=("test1.txt",),backup=".bak",inplace=1)asfile:
forlineinfile:
print(line.rstrip().replace('111111','222222'))
print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')
運行結果
6、重定向替換
解析
上面的例子,用到了inplace參數,表示是否將標準輸出的結果寫回文件,默認不取代。
代碼示例:
importfileinput
#觸發backup的動作,源文件內容被修改,對源文件進行backup
withfileinput.input(files=("test2.txt",),inplace=True)asfile:
print("[INFO]taskisstarted...")
forlineinfile:
print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')
print("[INFO]taskisclosed...")
運行結果
注
通過運行結果,可以看到:
在for循環體內的print內容會寫回到原文件中了。
而在for循環體外的print則沒有變化。
7、進階
openhook含義解析
在fileinput.input()中有一個openhook的參數,它支持用戶傳入自定義的對象讀取方法;
如果沒有傳入任何勾子,fileinput默認使用的是open函數;
方法介紹
fileinput內置了兩種勾子
1、fileinput.hook_compressed(filename,mode)
使用gzip和bz2模塊透明地打開gzip和bzip2壓縮的文件(通過擴展名.gz和.bz2來識別);
如果文件擴展名不是.gz或.bz2,文件會以正常方式打開(即使用open()并且不帶任何解壓操作);
使用示例:fi=fileinput.FileInput(openhook=fileinput.hook_compressed)
2、fileinput.hook_encoded(encoding,errors=None)
返回一個通過open()打開每個文件的鉤子,使用給定的encoding和errors來讀取文件。
使用示例:fi=fileinput.FileInput(openhook=fileinput.hook_encoded(utf-8,surrogateescape))
示例實戰
假如我想要使用fileinput來讀取網絡上的文件,思路:
先使用requests下載文件到本地
再使用open去讀取它;
defonline_open(url,mode):
importrequests
r=requests.get(url)
filename=url.split("/")[-1]
withopen(filename,'w')asf1:
f1.write(r.content.decode("utf-8"))
f2=open(filename,'r')
returnf2
直接將這個函數傳給openhook即可:
#-*-coding:utf-8-*-
#@Time:2025-07-23
#@Author:carl_DJ
importfileinput
file_url='/robots.txt'
withfileinput.input(files=(file_url,),openhook=online_open)asfile:
forlineinfile:
print(line,end="")
代碼整合:
#-*-coding:utf-8-*-
#@Time:2025-07-23
#@Author:carl_DJ
defonline_open(url,mode):
importrequests
r=requests.get(url)
filename=url.split("/")[-1]
withopen(filename,'w')asf1:
f1.write(r.content.decode("utf-8"))
f2=open(filename,'r')
returnf2
importfileinput
file_url='/robots.txt'
withfileinput.input(files=(fi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園膳食委員會會議記錄
- 廚余垃圾智能收運處置系統項目可行性分析
- 商鋪租房合同協議書
- 更換合同協議書
- 解除借錢合同協議書
- 樓頂防水合同協議書范本
- 林地合同終止協議書范本
- 打印店合同協議書
- 復婚合同協議書
- 畫室宿管合同協議書
- 【產業圖譜】2024年廣州市重點產業規劃布局全景圖譜(附各地區重點產業、產業體系布局、未來產業發展規劃等)
- 2024年云南省昆明市盤龍區小升初英語試卷
- GB/Z 44314-2024生物技術生物樣本保藏動物生物樣本保藏要求
- 溫室大棚鋼結構安裝方案
- 2024-2030年中國寵物殯葬服務行業市場深度調研及發展戰略與投資前景研究報告
- 人工智能賦能語文教育的創新發展研究
- 2020-2021年全國小升初語文真題匯編專題03字形(解析版)
- 單片機原理及應用智慧樹知到期末考試答案章節答案2024年溫州醫科大學
- 《中國心力衰竭診斷和治療指南2024》解讀(總)
- 2024年山東省濟南市市中區九年級中考二模數學試題?。ㄔ戆?解析版)
- “五育”與小學數學教育的融合
評論
0/150
提交評論