這個Python讀取文件的方法,堪稱天花板級別...

来源:https://www.cnblogs.com/hahaa/archive/2022/08/31/16644385.html
-Advertisement-
Play Games

序言 哈嘍兄弟們,今天咱們來瞭解一下 fileinput 。 說到fileinput,可能90%的碼農表示沒用過,甚至沒有聽說過。 這不奇怪,因為在python界,既然open可以走天下,何必要fileinput呢? 但是,今天我還是要介紹fileinput這個方法,因為太奈斯了。 不止是香。是真香 ...


序言

哈嘍兄弟們,今天咱們來瞭解一下 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、 預設讀取

代碼示例

import fileinput

'當 Python 腳本沒有傳入任何參數時,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='')

 

運行結果

 

 

解析:

  • fileinput 有且僅有這兩種讀取模式:‘r’,‘rb’;
  • fileinput.input() 預設使用 mode=‘r’ 的模式讀取文件,如果你的文件是二進位的,可以使用mode=‘rb’ 模式。

4、處理批量文件

多文件序號連續排序

調用方法

  • fileinput.lineno()方法

代碼示例

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

 

運行結果

 

 

多文件序號單獨排序

調用方法

  • fileinput.filelineno()方法

代碼示例

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、讀取與備份

調用方法

  • fileinput.input 的backup 參數,可以指定備份的尾碼名,比如 .bak

代碼示例

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

 

運行結果

 

 

6、重定向替換

解析

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

代碼示例:

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 則沒有變化。

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 去讀取它;
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 即可:

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="")
# Python學習交流群 279199867

 

運行結果

 

 

總結

關於fileinput的介紹,也就介紹到這裡。

fileinput本身是對 open 函數的再次封裝,所以在讀取的cc部分,就比open顯得更專業,更優雅,這也是僅限於讀取的方面。
在寫的方面,相對於open,就不是那麼的強悍。

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

最後,再給大家推薦一套Python爬蟲教程:代碼總是學完就忘記?100個爬蟲實戰項目!讓你沉迷學習丨學以致用丨下一個Python大神就是你!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 實現了自動生成和插槽兩個方式,主要把 el-table 和 el-pagination 封裝在一起 效果圖: 使用組件,啟用自動生成 :auto="true" 自動生成-編輯 (包括請求已經實現了)新增和刪除也是一樣 ps:如有額外的按鈕可以用插槽實現 查詢的時候,只需要多返回下麵數據,就可以自動生 ...
  • 問題: this.$refs[formName].validate((valid) =>{} 無效的問題,當驗證通過的時候點確定按鈕沒有報錯,也沒有任何反應。 背景: ruoyi前後端分離新項目,前端vue。 解決: 參考: this.$refs[formName].validate((valid) ...
  • Vue + Elementui 實現登錄頁 手機驗證碼、倒計時等功能 點擊打開視頻講解 更加詳細 <template> <div id="app"> <div class="left">用代碼改變世界</div> <el-form class="content" ref="refForm" :rul ...
  • 若依前後端分離項目中,提交含有qutil富文本控制項數據的表單,後端接收到的富文本數據,缺少了部分html標簽。 ...
  • YSLaunchar-a1.0 模型 基本介紹 本文不考慮所有具體的實現方法,之後會有更完整第二版發出 該程式計劃使用 julia 語言編寫,目前版本(1.7)並不包含類(class),取而代之,我會使用 julia 提供的兩種結構體完成。 考慮了很久,我將會把所有版本,玩家列表使用字典的形式。 主 ...
  • 目錄 一.OpenGL 圖像曝光度調節 1.原始圖片 2.效果演示 二.OpenGL 圖像曝光度調節源碼下載 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學 ...
  • 1、定製報告常用的裝飾器 結合表和示例圖查看 | 使用方法 | 參數值 | 參數說明 | | | | | | @allure.epic() | 項目名稱 | 項目名稱,樹結構第一層 | | @allure.feature() | 模塊名稱 | 模塊名稱,樹結構第二層 | | @allure.stor ...
  • 《Python極客項目編程 》中文PDF完整版免費下載地址 ↑ ↑ ↑ ↑ ↑ ↑ ↑ 點擊即可下載 內容簡介 · · · · · · Python 是一種強大的編程語言,容易學習而且充滿樂趣。但掌握了基本知識後,接下來做什麼? 本書通過14個有趣的項目,幫助和鼓勵讀者探索Python編程的世界。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...