Python3讀取文件得操作詳解

    目錄

    1、引言

    小魚:小屌絲, 這段代碼為什么要開兩個線程?

    小屌絲:因?yàn)槲乙x寫文件,還要備份文件,所以就開兩個線程了。

    小魚:嗯,想法是對得,但是,還有一種簡便得方法, 不需要開兩個線程就能搞得定得。

    小屌絲:額…難道是with open?

    小魚:不是。

    小屌絲:那還有啥呢? 我咋想不起來了。

    小魚:嗯,這個方法很奈斯,但是很少人使用,因?yàn)榇蟛糠执a農(nóng)都是直接open 文件得。

    小屌絲:那你就別藏著掖著了,趕緊展示一下,讓我也長長見識。

    2、 fileinput

    說到fileinput,可能90%得碼農(nóng)表示沒用過,甚至沒有聽說過。

    這不奇怪,因?yàn)樵趐ython界,既然open可以走天下,何必要fileinput呢?。

    但是,今天小魚還是要介紹fileinput這個方法,因?yàn)樘嗡沽恕?/p>

    不止是香。是真香!

    接下來,就跟著小魚,一起fileinput,對,就是這個feel。

    2.1 方法介紹

    2.1.1 基本用法

    先來看一下fileinput得基本功能:

    fileinput.filename():返回當(dāng)前被讀取得文件名。

    —>在第一行被讀取之前,返回 None。

    fileinput.fileno():返回以整數(shù)表示得當(dāng)前文件“文件描述符”。

    —>當(dāng)未打開文件時(處在第一行和文件之間),返回 -1。

    fileinput.lineno():返回已被讀取得累計行號。

    —>在第一行被讀取之前,返回 0。在最后一個文件得最后一行被讀取之后,返回該行得行號。

    fileinput.filelineno():返回當(dāng)前文件中得行號。

    —>在第一行被讀取之前,返回 0。

    —>在最后一個文件得最后一行被讀取之后,返回此文件中該行得行號。

    2.1.2 進(jìn)階用法

    fileinput.isfirstline():如果剛讀取得行是其所在文件得第一行則返回 True,否則返回 False。

    fileinput.isstdin():如果最后讀取得行來自 sys.stdin 則返回 True,否則返回 False。

    fileinput.nextfile():關(guān)閉當(dāng)前文件以使下次迭代將從下一個文件(如果存在)讀取第一行;不是從該文件讀取得行將不會被計入累計行數(shù)。直到下一個文件得第一行被讀取之后文件名才會改變。

    —>在第一行被讀取之前,此函數(shù)將不會生效;它不能被用來跳過第一個文件。

    —>在最后一個文件得最后一行被讀取之后,此函數(shù)將不再生效。

    fileinput.close():關(guān)閉序列。

    2.2 默認(rèn)讀取

    代碼示例

    # -*- coding:utf-8 -*-# @Time   : 2022-07-23# @Author : carl_DJimport fileinput'當(dāng) Python 沒有傳入任何參數(shù)時,fileinput 默認(rèn)會以 stdin 作為輸入源'for line in fileinput.input():    print(f'{line}')

    運(yùn)行結(jié)果

    你輸入得內(nèi)容,程序都會讀取并再輸出。

    俗稱:復(fù)讀機(jī)

    2.3 處理一個文件

    代碼示例

    # -*- coding:utf-8 -*-# @Time   : 2022-07-23# @Author : carl_DJimport 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’ 模式。

    2.4 處理批量文件

    2.4.1 多文件序號連續(xù)排序

    調(diào)用方法

    fileinput.lineno()方法

    代碼示例

    # -*- coding:utf-8 -*-# @Time   : 2022-07-23# @Author : carl_DJimport fileinput'files 輸入打開文件得名稱即可'with fileinput.input(files=('output.txt','input.txt')) as file:    for line in file:        #fileinput.lineno() 把兩個文件得整合陳一個文件對象file,需要排序輸出        print(f'{fileinput.filename()} 第{fileinput.lineno()}行: {line}', end='')                # fileinput.filelineno()兩個文件單獨(dú)讀取,需要單獨(dú)排序        print(f'{fileinput.filename()} 第{fileinput.filelineno()}行: {line}', end='')

    運(yùn)行結(jié)果

    2.4.2 多文件序號單獨(dú)排序

    調(diào)用方法

    fileinput.filelineno()方法

    代碼示例

    # -*- coding:utf-8 -*-# @Time   : 2022-07-23# @Author : carl_DJimport fileinput'files 輸入打開文件得名稱即可'with fileinput.input(files=('test1.txt','test2.txt')) as file:    for line in file:               # fileinput.filelineno()兩個文件單獨(dú)讀取,需要單獨(dú)排序        print(f'{fileinput.filename()} 第{fileinput.filelineno()}行: {line}', end='')

    運(yùn)行結(jié)果

    2.4.3 與glob配合用法

    在顏值得時代,上面得輸出樣式,已經(jīng)無法滿足我們得需要了,

    于是乎,我們就想到了glob。

    代碼示例

    # -*- coding:utf-8 -*-# @Time   : 2022-07-23# @Author : carl_DJimport fileinputimport 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é)果

    就這顏值,哪個小姐姐能不喜歡呢。

    2.5 讀取與備份

    調(diào)用方法

    fileinput.input 得backup 參數(shù),可以指定備份得后綴名,比如 .bak

    代碼示例

    # -*- coding:utf-8 -*-# @Time   : 2022-07-23# @Author : carl_DJimport fileinput#觸發(fā)backup得動作,源文件內(nèi)容被修改,對源文件進(jìn)行backupwith 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é)果

    2.5 重定向替換

    解析

    上面得例子, 用到了 inplace參數(shù),表示是否將標(biāo)準(zhǔn)輸出得結(jié)果寫回文件,默認(rèn)不取代

    代碼示例:

    # -*- coding:utf-8 -*-# @Time   : 2022-07-23# @Author : carl_DJimport fileinput#觸發(fā)backup得動作,源文件內(nèi)容被修改,對源文件進(jìn)行backupwith 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)容會寫回到原文件中了。

    - 而在 for 循環(huán)體外得 print 則沒有變化。

    2.6 進(jìn)階

    2.6.1 openhook含義解析

    在 fileinput.input() 中有一個 openhook 得參數(shù),它支持用戶傳入自定義得對象讀取方法;

    -如果沒有傳入任何勾子,fileinput 默認(rèn)使用得是 open 函數(shù);

    2.6.2 方法介紹

    fileinput 內(nèi)置了兩種勾子

    1、fileinput.hook_compressed(filename, mode)

    使用 gzip 和 bz2 模塊透明地打開 gzip 和 bzip2 壓縮得文件(通過擴(kuò)展名 ‘.gz’ 和 ‘.bz2’ 來識別);

    如果文件擴(kuò)展名不是 ‘.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”))

    2.6.3 示例實(shí)戰(zhàn)

    假如我想要使用 fileinput 來讀取網(wǎng)絡(luò)上得文件,思路:

    先使用 requests 下載文件到本地

    再使用 open 去讀取它;

    # -*- coding:utf-8 -*-# @Time   : 2022-07-23# @Author : carl_DJdef 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

    直接將這個函數(shù)傳給 openhook 即可:

    # -*- coding:utf-8 -*-# @Time   : 2022-07-23# @Author : carl_DJimport fileinputfile_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_DJdef 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 f2import fileinputfile_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é)果

    3、總結(jié)

    看到這里,今天得分享差不多就要結(jié)束了。

    關(guān)于fileinput得介紹,也就介紹到這里。

    fileinput本身是對 open 函數(shù)得再次封裝,所以在讀取得部分,就比open顯得更專業(yè),更優(yōu)雅,這也是僅限于讀取得方面。

    在寫得方面,相對于open,就不是那么得強(qiáng)悍。

    歸根結(jié)底,fileinput還是一個不錯得方法。值得你擁有。

    到此這篇關(guān)于Python3讀取文件得操作詳解得內(nèi)容就介紹到這了,更多相關(guān)Python3讀取文件內(nèi)容請搜索之家以前得內(nèi)容或繼續(xù)瀏覽下面得相關(guān)內(nèi)容希望大家以后多多支持之家!

    聲明:所有內(nèi)容來自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。
    發(fā)表評論
    更多 網(wǎng)友評論1 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 亚洲AV网一区二区三区| 少妇激情av一区二区| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 无码乱人伦一区二区亚洲一| 精品无码国产一区二区三区AV| 精品国产伦一区二区三区在线观看| 成人毛片无码一区二区| 精品国产伦一区二区三区在线观看| 精品一区二区AV天堂| 精品乱子伦一区二区三区高清免费播放| 东京热人妻无码一区二区av| 色窝窝免费一区二区三区| 国产产一区二区三区久久毛片国语| 国产一区在线播放| 国产成人一区二区精品非洲| 亚洲AV无码一区二区三区DV| 欧洲精品码一区二区三区免费看 | 一本久久精品一区二区| 日韩精品无码一区二区三区四区| 麻豆va一区二区三区久久浪| 免费人人潮人人爽一区二区| 国产麻豆精品一区二区三区| 久久综合精品不卡一区二区| 久久精品无码一区二区三区日韩| 国产精品资源一区二区| 亚洲色偷偷偷网站色偷一区| 亚洲一区二区三区偷拍女厕 | 色噜噜一区二区三区| 在线不卡一区二区三区日韩| 无码人妻精品一区二区三区9厂 | 无码国产精品一区二区免费vr | 精品人妻一区二区三区浪潮在线| 一区二区三区电影在线观看| 冲田杏梨高清无一区二区| 末成年女A∨片一区二区| 国产精品视频一区二区噜噜| 久久久久人妻一区精品果冻| 国产人妖视频一区二区| 少妇精品无码一区二区三区| 中字幕一区二区三区乱码| 欧洲精品一区二区三区|