前言
嗨嘍,大家好呀~這里是愛(ài)看美女的茜茜吶
又到了學(xué)Python時(shí)刻~
今天咱們來(lái)了解一下 fileinput 成榜。
說(shuō)到fileinput框舔,可能90%的碼農(nóng)表示沒(méi)用過(guò),甚至沒(méi)有聽(tīng)說(shuō)過(guò)伦连。
這不奇怪雨饺,因?yàn)樵趐ython界,既然open可以走天下惑淳,何必要fileinput呢额港?
但是,今天我還是要介紹fileinput這個(gè)方法歧焦,因?yàn)樘嗡沽恕?/p>
不止是香移斩。是真香!
接下來(lái)绢馍,就跟著我牡昆,一起fileinput丛楚,對(duì)嗽冒,就是這個(gè)feel就珠。
正文
1、方法介紹
基本用法
先來(lái)看一下fileinput
的基本功能:
-
fileinput.filename()
:返回當(dāng)前被讀取的文件名瓷耙。
—>在第一行被讀取之前朱躺,返回 None
刁赖。
-
fileinput.fileno()
:返回以整數(shù)表示的當(dāng)前文件“文件描述符”。
—>當(dāng)未打開(kāi)文件時(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()
:如果最后讀取的行來(lái)自 sys.stdin 則返回 True泽裳,否則返回 False瞒斩。fileinput.nextfile()
:關(guān)閉當(dāng)前文件以使下次迭代將從下一個(gè)文件(如果存在)讀取第一行;不是從該文件讀取的行將不會(huì)被計(jì)入累計(jì)行數(shù)涮总。直到下一個(gè)文件的第一行被讀取之后文件名才會(huì)改變胸囱。
—>在第一行被讀取之前,此函數(shù)將不會(huì)生效瀑梗;它不能被用來(lái)跳過(guò)第一個(gè)文件烹笔。
—>在最后一個(gè)文件的最后一行被讀取之后,此函數(shù)將不再生效抛丽。
-
fileinput.close()
:關(guān)閉序列谤职。
2、 默認(rèn)讀取
代碼示例
import fileinput
'當(dāng) Python 腳本沒(méi)有傳入任何參數(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 輸入打開(kāi)文件的名稱即可'
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 輸入打開(kāi)文件的名稱即可'
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 輸入打開(kāi)文件的名稱即可'
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)無(wú)法滿足我們的需要了翘簇,于是乎,我們就想到了glob
儿倒。
代碼示例
import fileinput
import glob
#glob 匹配te開(kāi)頭的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é)果寫(xiě)回文件,默認(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é)果
注
通過(guò)運(yùn)行結(jié)果姻氨,可以看到:
在
for
循環(huán)體內(nèi)的print
內(nèi)容會(huì)寫(xiě)回到原文件中了钓辆。而在
for
循環(huán)體外的print
則沒(méi)有變化。
7肴焊、進(jìn)階
openhook
含義解析
在 fileinput.input() 中有一個(gè) openhook 的參數(shù)前联,它支持用戶傳入自定義的對(duì)象讀取方法;
如果沒(méi)有傳入任何勾子娶眷,fileinput 默認(rèn)使用的是 open 函數(shù)似嗤;
方法介紹
fileinput
內(nèi)置了兩種勾子
1、fileinput.hook_compressed(filename, mode)
使用
gzip
和bz2
模塊透明地打開(kāi)gzip
和bzip2
壓縮的文件(通過(guò)擴(kuò)展名‘.gz’
和‘.bz2’
來(lái)識(shí)別)茂浮;如果文件擴(kuò)展名不是
‘.gz’
或‘.bz2’
双谆,文件會(huì)以正常方式打開(kāi)(即使用open()
并且不帶任何解壓操作);
使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_compressed)
2席揽、fileinput.hook_encoded(encoding, errors=None)
- 返回一個(gè)通過(guò)
open()
打開(kāi)每個(gè)文件的鉤子顽馋,使用給定的encoding
和errors
來(lái)讀取文件。
使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_encoded(“utf-8”, “surrogateescape”))
示例實(shí)戰(zhàn)
假如我想要使用 fileinput
來(lái)讀取網(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="")
小伙伴們?cè)趯W(xué)習(xí)Python的過(guò)程中,有時(shí)候不知道怎么學(xué)属桦,從哪里開(kāi)始學(xué)熊痴。掌握了一些基本的知識(shí)或者做了一些案例后他爸,不知道下一步怎么走,不知道如何去學(xué)習(xí)更加高深的知識(shí)果善。
那么對(duì)于這些大兄弟們诊笤,我準(zhǔn)備了大量的免費(fèi)視頻教程,PDF電子書(shū)籍巾陕,以及源代碼讨跟!
==點(diǎn)擊 藍(lán)色字體 自取,我都放在這里了鄙煤。==
還會(huì)有大佬解答晾匠!
運(yùn)行結(jié)果
總結(jié)
關(guān)于fileinput的介紹,也就介紹到這里梯刚。
fileinput本身是對(duì) open 函數(shù)的再次封裝凉馆,所以在讀取的cc部分,就比open顯得更專業(yè)亡资,更優(yōu)雅澜共,這也是僅限于讀取的方面。
在寫(xiě)的方面锥腻,相對(duì)于open咳胃,就不是那么的強(qiáng)悍。
歸根結(jié)底旷太,fileinput還是一個(gè)不錯(cuò)的方法。值得你擁有销睁。
希望本篇文章有對(duì)你帶來(lái)幫助 ??供璧,有學(xué)習(xí)到一點(diǎn)知識(shí)~