




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第Python實現(xiàn)讀取文件的方法總結(jié)目錄序言1、方法介紹2、默認(rèn)讀取3、處理一個文件4、處理批量文件5、讀取與備份6、重定向替換7、進階總結(jié)
序言
哈嘍兄弟們,今天咱們來了解一下fileinput。
說到fileinput,可能90%的碼農(nóng)表示沒用過,甚至沒有聽說過。
這不奇怪,因為在python界,既然open可以走天下,何必要fileinput呢?
但是,今天我還是要介紹fileinput這個方法,因為太奈斯了。
不止是香。是真香!
接下來,就跟著我,一起fileinput,對,就是這個feel。
1、方法介紹
基本用法
先來看一下fileinput的基本功能:
fileinput.filename():返回當(dāng)前被讀取的文件名。
在第一行被讀取之前,返回None。
fileinput.fileno():返回以整數(shù)表示的當(dāng)前文件文件描述符。
當(dāng)未打開文件時(處在第一行和文件之間),返回-1。
fileinput.lineno():返回已被讀取的累計行號。
在第一行被讀取之前,返回0。在最后一個文件的最后一行被讀取之后,返回該行的行號。
fileinput.filelineno():返回當(dāng)前文件中的行號。
在第一行被讀取之前,返回0。
在最后一個文件的最后一行被讀取之后,返回此文件中該行的行號。
進階用法
fileinput.isfirstline():如果剛讀取的行是其所在文件的第一行則返回True,否則返回False。
fileinput.isstdin():如果最后讀取的行來自sys.stdin則返回True,否則返回False。
fileinput.nextfile():關(guān)閉當(dāng)前文件以使下次迭代將從下一個文件(如果存在)讀取第一行;不是從該文件讀取的行將不會被計入累計行數(shù)。直到下一個文件的第一行被讀取之后文件名才會改變。
在第一行被讀取之前,此函數(shù)將不會生效;它不能被用來跳過第一個文件。
在最后一個文件的最后一行被讀取之后,此函數(shù)將不再生效。
fileinput.close():關(guān)閉序列。
2、默認(rèn)讀取
代碼示例
importfileinput
'當(dāng)Python腳本沒有傳入任何參數(shù)時,fileinput默認(rèn)會以stdin作為輸入源'
forlineinfileinput.input():
print(f'{line}')
運行結(jié)果
你輸入的內(nèi)容,程序都會讀取并再輸出。
俗稱:復(fù)讀機
3、處理一個文件
代碼示例
importfileinput
'files輸入打開文件的名稱即可'
withfileinput.input(files=('output.txt',))asfile:
forlineinfile:
print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')
運行結(jié)果
解析:
fileinput有且僅有這兩種讀取模式:r,rb
fileinput.input()默認(rèn)使用mode=r的模式讀取文件,如果你的文件是二進制的,可以使用mode=rb模式。
4、處理批量文件
多文件序號連續(xù)排序
調(diào)用方法
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='')
運行結(jié)果
多文件序號單獨排序
調(diào)用方法
fileinput.filelineno()方法
代碼示例
importfileinput
'files輸入打開文件的名稱即可'
withfileinput.input(files=('test1.txt','test2.txt'))asfile:
forlineinfile:
#fileinput.filelineno()兩個文件單獨讀取,需要單獨排序
print(f'{fileinput.filename()}第{fileinput.filelineno()}行:{line}',end='')
運行結(jié)果
與glob配合用法
在顏值的時代,上面的輸出樣式,已經(jīng)無法滿足我們的需要了,于是乎,我們就想到了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='')
運行結(jié)果
就這顏值,哪個小姐姐能不喜歡呢。
5、讀取與備份
調(diào)用方法
fileinput.input的backup參數(shù),可以指定備份的后綴名,比如.bak
代碼示例
importfileinput
#觸發(fā)backup的動作,源文件內(nèi)容被修改,對源文件進行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='')
運行結(jié)果
6、重定向替換
解析
上面的例子,用到了inplace參數(shù),表示是否將標(biāo)準(zhǔn)輸出的結(jié)果寫回文件,默認(rèn)不取代。
代碼示例:
importfileinput
#觸發(fā)backup的動作,源文件內(nèi)容被修改,對源文件進行backup
withfileinput.input(files=("test2.txt",),inplace=True)asfile:
print("[INFO]taskisstarted...")
forlineinfile:
print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')
print("[INFO]taskisclosed...")
運行結(jié)果
注
通過運行結(jié)果,可以看到:
在for循環(huán)體內(nèi)的print內(nèi)容會寫回到原文件中了。
而在for循環(huán)體外的print則沒有變化。
7、進階
openhook含義解析
在fileinput.input()中有一個openhook的參數(shù),它支持用戶傳入自定義的對象讀取方法;
如果沒有傳入任何勾子,fileinput默認(rèn)使用的是open函數(shù);
方法介紹
fileinput內(nèi)置了兩種勾子
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))
示例實戰(zhàn)
假如我想要使用fileinput來讀取網(wǎng)絡(luò)上的文件,思路:
先使用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
直接將這個函數(shù)傳給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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 裝飾施工咨詢合同協(xié)議
- 裝修架合同協(xié)議
- 裝修供貨協(xié)議合同協(xié)議
- 螺紋鋼管采購合同協(xié)議
- 西安水電暖合同協(xié)議
- 蒲城鏟車租賃合同協(xié)議
- 裝修意向施工合同協(xié)議
- 草皮種植戶合同協(xié)議
- 裝飾墻石材工程合同協(xié)議
- 草地承包建房合同協(xié)議
- ISO27001:2022信息安全管理手冊+全套程序文件+表單
- 《電力建設(shè)施工企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化實施規(guī)范》
- 產(chǎn)后肺栓塞護理查房
- 2.4.1基于解析算法的問題解決課件人教-中圖版高中信息技術(shù)必修1
- 國測省測四年級勞動質(zhì)量檢測試卷
- 2023年-2024年《西方經(jīng)濟學(xué)》考試題庫及答案
- 匠作匠場手風(fēng)滇南“一顆印”民居大木匠作調(diào)查研究
- 《道德經(jīng)》的智慧啟示智慧樹知到期末考試答案2024年
- 黔靈山景區(qū)介紹
- 交警酒駕案件培訓(xùn)課件
- 建筑企業(yè)材料成本管理
評論
0/150
提交評論