<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
小魚:小屌絲, 這段程式碼為什麼要開兩個執行緒?
小屌絲:因為我要讀寫檔案,還要備份檔案,所以就開兩個執行緒了。
小魚:嗯,想法是對的,但是,還有一種簡便的方法, 不需要開兩個執行緒就能搞得定的。
小屌絲:額…難道是with open?
小魚:不是。
小屌絲:那還有啥呢? 我咋想不起來了。
小魚:嗯,這個方法很奈斯,但是很少人使用,因為大部分碼農都是直接open 檔案的。
小屌絲:那你就別藏著掖著了,趕緊展示一下,讓我也長長見識。
說到fileinput,可能90%的碼農表示沒用過,甚至沒有聽說過。
這不奇怪,因為在python界,既然open可以走天下,何必要fileinput呢?。
但是,今天小魚還是要介紹fileinput這個方法,因為太奈斯了。
不止是香。是真香!
接下來,就跟著小魚,一起fileinput,對,就是這個feel。
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():關閉序列。
程式碼範例
# -*- coding:utf-8 -*- # @Time : 2022-07-23 # @Author : carl_DJ import fileinput '當 Python 指令碼沒有傳入任何引數時,fileinput 預設會以 stdin 作為輸入源' for line in fileinput.input(): print(f'{line}')
執行結果
你輸入的內容,程式都會讀取並再輸出。
俗稱:復讀機
程式碼範例
# -*- coding:utf-8 -*- # @Time : 2022-07-23 # @Author : carl_DJ import 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.1 多檔案序號連續排序
呼叫方法
fileinput.lineno()方法
程式碼範例
# -*- coding:utf-8 -*- # @Time : 2022-07-23 # @Author : carl_DJ import 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_DJ import 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_DJ 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='')
執行結果
就這顏值,哪個小姐姐能不喜歡呢。
呼叫方法
fileinput.input 的backup 引數,可以指定備份的字尾名,比如 .bak
程式碼範例
# -*- coding:utf-8 -*- # @Time : 2022-07-23 # @Author : carl_DJ import fileinput #觸發backup的動作,原始檔內容被修改,對原始檔進行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='')
執行結果
解析
上面的例子, 用到了 inplace引數,表示是否將標準輸出的結果寫回檔案,預設不取代
程式碼範例:
# -*- coding:utf-8 -*- # @Time : 2022-07-23 # @Author : carl_DJ import fileinput #觸發backup的動作,原始檔內容被修改,對原始檔進行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...")
執行結果
注
通過執行結果,可以看到:
- 在 for 迴圈體內的 print 內容會寫回到原檔案中了。
- 而在 for 迴圈體外的 print 則沒有變化。
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_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
直接將這個函數傳給 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="")
執行結果
看到這裡,今天的分享差不多就要結束了。
關於fileinput的介紹,也就介紹到這裡。
fileinput本身是對 open 函數的再次封裝,所以在讀取的部分,就比open顯得更專業,更優雅,這也是僅限於讀取的方面。
在寫的方面,相對於open,就不是那麼的強悍。
歸根結底,fileinput還是一個不錯的方法。值得你擁有。
到此這篇關於Python3讀取檔案的操作詳解的文章就介紹到這了,更多相關Python3讀取檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45