Python實(shí)現(xiàn)讀取文件的方法總結(jié)
序言
哈嘍兄弟們,今天咱們來了解一下 fileinput 。
說到fileinput,可能90%的碼農(nóng)表示沒用過,甚至沒有聽說過。
這不奇怪,因?yàn)樵趐ython界,既然open可以走天下,何必要fileinput呢?
但是,今天我還是要介紹fileinput這個(gè)方法,因?yàn)樘嗡沽恕?/p>
不止是香。是真香!
接下來,就跟著我,一起fileinput,對(duì),就是這個(gè)feel。
1、方法介紹
基本用法
先來看一下fileinput的基本功能:
fileinput.filename():返回當(dāng)前被讀取的文件名。
—>在第一行被讀取之前,返回 None。
fileinput.fileno():返回以整數(shù)表示的當(dāng)前文件“文件描述符”。
—>當(dāng)未打開文件時(shí)(處在第一行和文件之間),返回 -1。
fileinput.lineno():返回已被讀取的累計(jì)行號(hào)。
—>在第一行被讀取之前,返回 0。在最后一個(gè)文件的最后一行被讀取之后,返回該行的行號(hào)。
fileinput.filelineno():返回當(dāng)前文件中的行號(hào)。
—>在第一行被讀取之前,返回 0。
—>在最后一個(gè)文件的最后一行被讀取之后,返回此文件中該行的行號(hào)。
進(jìn)階用法
fileinput.isfirstline():如果剛讀取的行是其所在文件的第一行則返回 True,否則返回 False。
fileinput.isstdin():如果最后讀取的行來自 sys.stdin 則返回 True,否則返回 False。
fileinput.nextfile():關(guān)閉當(dāng)前文件以使下次迭代將從下一個(gè)文件(如果存在)讀取第一行;不是從該文件讀取的行將不會(huì)被計(jì)入累計(jì)行數(shù)。直到下一個(gè)文件的第一行被讀取之后文件名才會(huì)改變。
—>在第一行被讀取之前,此函數(shù)將不會(huì)生效;它不能被用來跳過第一個(gè)文件。
—>在最后一個(gè)文件的最后一行被讀取之后,此函數(shù)將不再生效。
fileinput.close():關(guān)閉序列。
2、 默認(rèn)讀取
代碼示例
import fileinput '當(dāng) Python 腳本沒有傳入任何參數(shù)時(shí),fileinput 默認(rèn)會(huì)以 stdin 作為輸入源' for line in fileinput.input(): print(f'{line}')
運(yùn)行結(jié)果
你輸入的內(nèi)容,程序都會(huì)讀取并再輸出。
俗稱:復(fù)讀機(jī)
3、處理一個(gè)文件
代碼示例
import fileinput 'files 輸入打開文件的名稱即可' with fileinput.input(files=('output.txt',)) as file: for line in file: print(f'{fileinput.filename()} 第{fileinput.lineno()}行:{line}',end='')
運(yùn)行結(jié)果
解析:
fileinput 有且僅有這兩種讀取模式:‘r’,‘rb’;
fileinput.input() 默認(rèn)使用 mode=‘r’ 的模式讀取文件,如果你的文件是二進(jìn)制的,可以使用mode=‘rb’ 模式。
4、處理批量文件
多文件序號(hào)連續(xù)排序
調(diào)用方法
fileinput.lineno()方法
代碼示例
import fileinput 'files 輸入打開文件的名稱即可' with fileinput.input(files=('output.txt','input.txt')) as file: for line in file: #fileinput.lineno() 把兩個(gè)文件的整合陳一個(gè)文件對(duì)象file,需要排序輸出 print(f'{fileinput.filename()} 第{fileinput.lineno()}行: {line}', end='') # fileinput.filelineno()兩個(gè)文件單獨(dú)讀取,需要單獨(dú)排序 print(f'{fileinput.filename()} 第{fileinput.filelineno()}行: {line}', end='')
運(yùn)行結(jié)果
多文件序號(hào)單獨(dú)排序
調(diào)用方法
fileinput.filelineno()方法
代碼示例
import fileinput 'files 輸入打開文件的名稱即可' with fileinput.input(files=('test1.txt','test2.txt')) as file: for line in file: # fileinput.filelineno()兩個(gè)文件單獨(dú)讀取,需要單獨(dú)排序 print(f'{fileinput.filename()} 第{fileinput.filelineno()}行: {line}', end='')
運(yùn)行結(jié)果
與glob配合用法
在顏值的時(shí)代,上面的輸出樣式,已經(jīng)無法滿足我們的需要了,于是乎,我們就想到了glob。
代碼示例
import fileinput import glob #glob 匹配te開頭的txt文件 for line in fileinput.input(glob.glob("te*.txt")): if fileinput.isfirstline(): #輸出讀取文件 print('='*10,f'讀取文件{fileinput.filename()}','='*10) #fileinput.filelineno()方法讀取 print(str(fileinput.filelineno())+ ':'+line.upper(),end='')
運(yùn)行結(jié)果
就這顏值,哪個(gè)小姐姐能不喜歡呢。
5、讀取與備份
調(diào)用方法
fileinput.input 的backup 參數(shù),可以指定備份的后綴名,比如 .bak
代碼示例
import fileinput #觸發(fā)backup的動(dòng)作,源文件內(nèi)容被修改,對(duì)源文件進(jìn)行backup with fileinput.input(files=("test1.txt",), backup=".bak",inplace=1) as file: for line in file: print(line.rstrip().replace('111111', '222222')) print(f'{fileinput.filename()} 第{fileinput.lineno()}行: {line}', end='')
運(yùn)行結(jié)果
6、重定向替換
解析
上面的例子, 用到了 inplace參數(shù),表示是否將標(biāo)準(zhǔn)輸出的結(jié)果寫回文件,默認(rèn)不取代。
代碼示例:
import fileinput #觸發(fā)backup的動(dòng)作,源文件內(nèi)容被修改,對(duì)源文件進(jìn)行backup with fileinput.input(files=("test2.txt",), inplace=True) as file: print("[INFO] task is started...") for line in file: print(f'{fileinput.filename()} 第{fileinput.lineno()}行: {line}', end='') print("[INFO] task is closed...")
運(yùn)行結(jié)果
注
通過運(yùn)行結(jié)果,可以看到:
在 for 循環(huán)體內(nèi)的 print 內(nèi)容會(huì)寫回到原文件中了。
而在 for 循環(huán)體外的 print 則沒有變化。
7、進(jìn)階
openhook含義解析
在 fileinput.input() 中有一個(gè) openhook 的參數(shù),它支持用戶傳入自定義的對(duì)象讀取方法;
如果沒有傳入任何勾子,fileinput 默認(rèn)使用的是 open 函數(shù);
方法介紹
fileinput 內(nèi)置了兩種勾子
1、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)
2、fileinput.hook_encoded(encoding, errors=None)
返回一個(gè)通過 open() 打開每個(gè)文件的鉤子,使用給定的 encoding 和 errors 來讀取文件。
使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_encoded(“utf-8”, “surrogateescape”))
示例實(shí)戰(zhàn)
假如我想要使用 fileinput 來讀取網(wǎng)絡(luò)上的文件,思路:
先使用 requests 下載文件到本地
再使用 open 去讀取它;
def online_open(url, mode): import requests r = requests.get(url) filename = url.split("/")[-1] with open(filename,'w') as f1: f1.write(r.content.decode("utf-8")) f2 = open(filename,'r') return f2
直接將這個(gè)函數(shù)傳給 openhook 即可:
# -*- coding:utf-8 -*- # @Time : 2022-07-23 # @Author : carl_DJ import fileinput file_url = 'https://www.csdn.net/robots.txt' with fileinput.input(files=(file_url,), openhook=online_open) as file: for line in file: print(line, end="")
代碼整合:
# -*- coding:utf-8 -*- # @Time : 2022-07-23 # @Author : carl_DJ def online_open(url, mode): import requests r = requests.get(url) filename = url.split("/")[-1] with open(filename,'w') as f1: f1.write(r.content.decode("utf-8")) f2 = open(filename,'r') return f2 import fileinput file_url = 'https://www.csdn.net/robots.txt' with fileinput.input(files=(file_url,), openhook=online_open) as file: for line in file: print(line, end="")
運(yùn)行結(jié)果
總結(jié)
關(guān)于fileinput的介紹,也就介紹到這里。
fileinput本身是對(duì) open 函數(shù)的再次封裝,所以在讀取的cc部分,就比open顯得更專業(yè),更優(yōu)雅,這也是僅限于讀取的方面。
在寫的方面,相對(duì)于open,就不是那么的強(qiáng)悍。
歸根結(jié)底,fileinput還是一個(gè)不錯(cuò)的方法。值得你擁有。
到此這篇關(guān)于Python實(shí)現(xiàn)讀取文件的方法總結(jié)的文章就介紹到這了,更多相關(guān)Python讀取文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡(jiǎn)單介紹Python的輕便web框架Bottle
這篇文章主要介紹了Python的輕便web框架Bottle,因其注重輕便的設(shè)計(jì),與Flask一樣,Bottle框架的人氣同樣也非常高,需要的朋友可以參考下2015-04-04關(guān)于django 1.10 CSRF驗(yàn)證失敗的解決方法
今天小編就為大家分享一篇關(guān)于django 1.10 CSRF驗(yàn)證失敗的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Flask SocketIO實(shí)現(xiàn)動(dòng)態(tài)繪圖的示例詳解
Flask-SocketIO 是基于 Flask 的一個(gè)擴(kuò)展,用于簡(jiǎn)化在 Flask 應(yīng)用中集成 WebSocket 功能,本文主要介紹了Flask SocketIO如何實(shí)現(xiàn)動(dòng)態(tài)繪圖,需要的可以參考下2023-11-11Python實(shí)現(xiàn)淘寶秒殺功能的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)淘寶秒殺功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Python實(shí)現(xiàn)的HTTP并發(fā)測(cè)試完整示例
這篇文章主要介紹了Python實(shí)現(xiàn)的HTTP并發(fā)測(cè)試,涉及Python多線程并發(fā)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-05-05一些讓Python代碼簡(jiǎn)潔的實(shí)用技巧總結(jié)
隨著項(xiàng)目代碼行數(shù)的增加,不可避免的遇到軟件架構(gòu)腐敗的問題,所以如何寫出簡(jiǎn)潔的代碼至關(guān)重要,這篇文章主要給大家介紹了一些讓Python代碼簡(jiǎn)潔的實(shí)用技巧,需要的朋友可以參考下2021-08-08Python輸入圓半徑,計(jì)算圓周長(zhǎng)和面積的實(shí)現(xiàn)方式
這篇文章主要介紹了Python輸入圓半徑,計(jì)算圓周長(zhǎng)和面積的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Python+Selenium實(shí)現(xiàn)自動(dòng)填寫問卷
本文主要介紹了Python+Selenium實(shí)現(xiàn)自動(dòng)填寫問卷,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07