Python實現讀取文件的方法總結_第1頁
Python實現讀取文件的方法總結_第2頁
Python實現讀取文件的方法總結_第3頁
Python實現讀取文件的方法總結_第4頁
Python實現讀取文件的方法總結_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第Python實現讀取文件的方法總結目錄序言1、方法介紹2、默認讀取3、處理一個文件4、處理批量文件5、讀取與備份6、重定向替換7、進階總結

序言

哈嘍兄弟們,今天咱們來了解一下fileinput。

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

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

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

不止是香。是真香!

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

1、方法介紹

基本用法

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

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

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

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

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

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

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

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

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

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

進階用法

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

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

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

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

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

fileinput.close():關閉序列。

2、默認讀取

代碼示例

importfileinput

'當Python腳本沒有傳入任何參數時,fileinput默認會以stdin作為輸入源'

forlineinfileinput.input():

print(f'{line}')

運行結果

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

俗稱:復讀機

3、處理一個文件

代碼示例

importfileinput

'files輸入打開文件的名稱即可'

withfileinput.input(files=('output.txt',))asfile:

forlineinfile:

print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')

運行結果

解析:

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

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

4、處理批量文件

多文件序號連續排序

調用方法

fileinput.lineno()方法

代碼示例

importfileinput

'files輸入打開文件的名稱即可'

withfileinput.input(files=('output.txt','input.txt'))asfile:

forlineinfile:

#fileinput.lineno()把兩個文件的整合陳一個文件對象file,需要排序輸出

print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')

#fileinput.filelineno()兩個文件單獨讀取,需要單獨排序

print(f'{fileinput.filename()}第{fileinput.filelineno()}行:{line}',end='')

運行結果

多文件序號單獨排序

調用方法

fileinput.filelineno()方法

代碼示例

importfileinput

'files輸入打開文件的名稱即可'

withfileinput.input(files=('test1.txt','test2.txt'))asfile:

forlineinfile:

#fileinput.filelineno()兩個文件單獨讀取,需要單獨排序

print(f'{fileinput.filename()}第{fileinput.filelineno()}行:{line}',end='')

運行結果

與glob配合用法

在顏值的時代,上面的輸出樣式,已經無法滿足我們的需要了,于是乎,我們就想到了glob。

代碼示例

importfileinput

importglob

#glob匹配te開頭的txt文件

forlineinfileinput.input(glob.glob("te*.txt")):

iffileinput.isfirstline():

#輸出讀取文件

print('='*10,f'讀取文件{fileinput.filename()}','='*10)

#fileinput.filelineno()方法讀取

print(str(fileinput.filelineno())+':'+line.upper(),end='')

運行結果

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

5、讀取與備份

調用方法

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

代碼示例

importfileinput

#觸發backup的動作,源文件內容被修改,對源文件進行backup

withfileinput.input(files=("test1.txt",),backup=".bak",inplace=1)asfile:

forlineinfile:

print(line.rstrip().replace('111111','222222'))

print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')

運行結果

6、重定向替換

解析

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

代碼示例:

importfileinput

#觸發backup的動作,源文件內容被修改,對源文件進行backup

withfileinput.input(files=("test2.txt",),inplace=True)asfile:

print("[INFO]taskisstarted...")

forlineinfile:

print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')

print("[INFO]taskisclosed...")

運行結果

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

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

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

7、進階

openhook含義解析

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

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

方法介紹

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

示例實戰

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

先使用requests下載文件到本地

再使用open去讀取它;

defonline_open(url,mode):

importrequests

r=requests.get(url)

filename=url.split("/")[-1]

withopen(filename,'w')asf1:

f1.write(r.content.decode("utf-8"))

f2=open(filename,'r')

returnf2

直接將這個函數傳給openhook即可:

#-*-coding:utf-8-*-

#@Time:2025-07-23

#@Author:carl_DJ

importfileinput

file_url='/robots.txt'

withfileinput.input(files=(file_url,),openhook=online_open)asfile:

forlineinfile:

print(line,end="")

代碼整合:

#-*-coding:utf-8-*-

#@Time:2025-07-23

#@Author:carl_DJ

defonline_open(url,mode):

importrequests

r=requests.get(url)

filename=url.split("/")[-1]

withopen(filename,'w')asf1:

f1.write(r.content.decode("utf-8"))

f2=open(filename,'r')

returnf2

importfileinput

file_url='/robots.txt'

withfileinput.input(files=(fi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論