哈嘍兄弟們,今天咱們來了解一下 fileinput 。 說到fileinput,可能90%的碼農表示沒用過,甚至沒有聽說過。 這不奇怪,因為在python界,既然open可以走天下,何必要fileinput呢? 但是,今天我還是要介紹fileinput這個方法,因為太奈斯了。 不止是香。是真香! 接下來,就跟著我,一起fileinput,對,就是這個feel。 小伙伴們在學習Python的過程中,有時候不知道怎么學,從哪里開始學。掌握了一些基本的知識或者做了一些案例后,不知道下一步怎么走,不知道如何去學習更加高深的知識。
正文1、方法介紹基本用法 先來看一下fileinput的基本功能:
進階用法
2、 默認讀取代碼示例 import fileinput
'當 Python 腳本沒有傳入任何參數(shù)時,fileinput 默認會以 stdin 作為輸入源' for line in fileinput.input(): print(f'{line}') 運行結果 你輸入的內容,程序都會讀取并再輸出。
3、處理一個文件代碼示例 import fileinput
'files 輸入打開文件的名稱即可' with fileinput.input(files=('output.txt',)) as file: for line in file: print(f'{fileinput.filename()} 第{fileinput.lineno()}行:{line}',end='')
運行結果 解析:
4、處理批量文件多文件序號連續(xù)排序 調用方法
代碼示例 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='')
運行結果 多文件序號單獨排序 調用方法
代碼示例 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='') 運行結果 與glob配合用法 在顏值的時代,上面的輸出樣式,已經無法滿足我們的需要了,于是乎,我們就想到了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='') 運行結果 就這顏值,哪個小姐姐能不喜歡呢。 5、讀取與備份調用方法
代碼示例
運行結果 6、重定向替換解析
代碼示例: import fileinput
#觸發(fā)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...')
運行結果 注 通過運行結果,可以看到:
7、進階openhook含義解析
方法介紹 fileinput 內置了兩種勾子 1、fileinput.hook_compressed(filename, mode)
2、fileinput.hook_encoded(encoding, errors=None)
示例實戰(zhàn) 假如我想要使用 fileinput 來讀取網絡上的文件,思路:
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 直接將這個函數(shù)傳給 openhook 即可: 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='') 代碼整合: 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 函數(shù)的再次封裝,所以在讀取的cc部分,就比open顯得更專業(yè),更優(yōu)雅,這也是僅限于讀取的方面。
歸根結底,fileinput還是一個不錯的方法。值得你擁有。 最后,再給大家推薦一套Python爬蟲教程:https://www.bilibili.com/video/BV1SA4y1976A |
|