Python3讀取文件得操作詳解

目錄

1、引言

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

小屌絲:因為我要讀寫文件,還要備份文件,所以就開兩個線程了。

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

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

小魚:不是。

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

小魚:嗯,這個方法很奈斯,但是很少人使用,因為大部分碼農都是直接open 文件得。

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

2、 fileinput

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

這不奇怪,因為在python界,既然open可以走天下,何必要fileinput呢?。

但是,今天小魚還是要介紹fileinput這個方法,因為太奈斯了。

不止是香。是真香!

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

2.1 方法介紹

2.1.1 基本用法

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

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

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

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

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

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

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

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

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

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

2.1.2 進階用法

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

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

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

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

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

fileinput.close():關閉序列。

2.2 默認讀取

代碼示例

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

運行結果

你輸入得內容,程序都會讀取并再輸出。

俗稱:復讀機

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='')

運行結果

解析:

fileinput 有且僅有這兩種讀取模式:‘r’,‘rb’;

fileinput.input() 默認使用 mode=‘r’ 得模式讀取文件,如果你得文件是二進制得,可以使用mode=‘rb’ 模式。

2.4 處理批量文件

2.4.1 多文件序號連續排序

調用方法

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()兩個文件單獨讀取,需要單獨排序        print(f'{fileinput.filename()} 第{fileinput.filelineno()}行: {line}', end='')

運行結果

2.4.2 多文件序號單獨排序

調用方法

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()兩個文件單獨讀取,需要單獨排序        print(f'{fileinput.filename()} 第{fileinput.filelineno()}行: {line}', end='')

運行結果

2.4.3 與glob配合用法

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

于是乎,我們就想到了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='')

運行結果

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

2.5 讀取與備份

調用方法

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

代碼示例

# -*- coding:utf-8 -*-# @Time   : 2022-07-23# @Author : carl_DJimport fileinput#觸發backup得動作,源文件內容被修改,對源文件進行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='')

運行結果

2.5 重定向替換

解析

上面得例子, 用到了 inplace參數,表示是否將標準輸出得結果寫回文件,默認不取代

代碼示例:

# -*- coding:utf-8 -*-# @Time   : 2022-07-23# @Author : carl_DJimport fileinput#觸發backup得動作,源文件內容被修改,對源文件進行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...")

運行結果

通過運行結果,可以看到:

- 在 for 循環體內得 print 內容會寫回到原文件中了。

- 而在 for 循環體外得 print 則沒有變化。

2.6 進階

2.6.1 openhook含義解析

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

-如果沒有傳入任何勾子,fileinput 默認使用得是 open 函數;

2.6.2 方法介紹

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”))

2.6.3 示例實戰

假如我想要使用 fileinput 來讀取網絡上得文件,思路:

先使用 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

直接將這個函數傳給 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="")

運行結果

3、總結

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

關于fileinput得介紹,也就介紹到這里。

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

在寫得方面,相對于open,就不是那么得強悍。

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

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

聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
發表評論
更多 網友評論1 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 国产一区在线电影| 国产乱人伦偷精品视频不卡| 欧美另类videovideosex| 中文字幕精品一区二区精品| 国产成人www| 日韩精品黄肉动漫在线观看| 亚洲国产精品白丝在线观看| 最新国产中文字幕| 精品福利视频网站| 亚洲一卡一卡二新区无人区| 国产精品美女网站在线看| 涂了媚药的玉势| 720lu国产刺激在线观看| 亚洲国产精品一区二区三区在线观看| 在线观看黄网站| 欧美人与动zozo| 香蕉视频一区二区三区| 中文字幕第五页| 人人爽天天爽夜夜爽曰| 国外免费直播性xxxx18| 最近中文AV字幕在线中文| 色多多视频在线| www视频免费看| 亚洲综合无码一区二区三区| 国产激情久久久久影院| 日韩人妻无码一区二区三区综合部| 蜜桃精品免费久久久久影院| √天堂资源最新版中文种子| 亚洲第一区视频在线观看| 国产又粗又猛又爽又黄的免费视频| 成人毛片18女人毛片免费| 永久黄网站色视频免费观看| 黄网站免费观看| jlzz大全高潮多水老师| 久久精品青草社区| 伊人久久综在合线亚洲91| 国产成人www| 香港黄色碟片黄色碟片| 一级毛片免费观看不收费| 亚洲H在线播放在线观看H| 咪咪色在线视频|