python--文件流讀寫

来源:https://www.cnblogs.com/thomson-fred/archive/2018/11/15/9961348.html
-Advertisement-
Play Games

在講述fileinput模塊之前,首先說一下python內置的文件API—open()函數以及與其相關的函數。 我這裡主要講講其中四個比較重要和常用的方法,更多的方法,可以參考:菜鳥教程http://www.runoob.com/python/file-methods.html (1)file = ...


在講述fileinput模塊之前,首先說一下python內置的文件API—open()函數以及與其相關的函數。

我這裡主要講講其中四個比較重要和常用的方法,更多的方法,可以參考:菜鳥教程http://www.runoob.com/python/file-methods.html

        

(1)file = open(file_name [, access_mode][, buffering])

參數解析:

1. file_name:

file_name變數是一個需要訪問的文件名稱的字元串值,在應用中需要用單引號或者雙引號將文件名包裹起來。

 

2. access_mode:

access_mode決定了打開文件的模式:只讀,寫入,追加等。這個參數是非強制的,預設文件訪問模式為只讀(r)

詳細模式可以參考:菜鳥教程http://www.runoob.com/python/python-files-io.html

 

3. buffering:

這個參數用於設置緩存區的大小。如果buffering的值被設為0,就不會有緩存。如果buffering的值取1,訪問文件時會寄存行。如果將buffering的值設為大於1的整數,這個整數就為緩存區的緩存大小。如果取負值,寄存區的緩衝大小則為系統預設。

 

(2)file.flush()方法

用於刷新緩衝區,,即將緩衝區中的數據立刻寫入文件,同時清空緩衝區

flush()方法在爬蟲中也用得挺多,在爬蟲過程由於種種原因,程式中斷,寫入緩存的數據沒有寫入磁碟很可惜,所以可以手動添加flush()方法

 

(3)file.close()方法

關閉文件,並將緩衝區的數據寫入文件中。

 

文件的緩存機制

在寫入文件內容的時候,在我們調用python的write()函數對文件進行寫入的時候,python解析器會調用操作系統的write方法,但值得註意的是,不是馬上保存到磁碟中的,是先寫到內核的緩衝區裡面,只有當我們主動調用flush()函數或者close()函數的時候,才會將緩衝區的內容寫入磁碟中。另外當寫入的數據量大於或者等於緩衝區的大小的時候,寫緩衝會自動同步到磁碟。

例如:

寫20萬行數據結果

file = open('file1.txt','a+')
for i in range(200000):
    file.write('this line is line%s'%i)
file.write('\r\n')

pycharm報出如下的提示

 

因為我設置的buffering是預設的系統的緩存大小,所以當寫到1999856行時,就剛好到系統的緩存區大小,因為所需要寫的數據大於緩存區的大小,所以這些內容直接就寫入了磁碟,而1998856後面的數據在寫入的時候還是先寫到了緩存區中,而這些數據的大小顯然是小於緩存區大小的,所以被保存在緩存區中,並沒有寫到磁碟。

 

使用flush()方法後,所有在緩存區的數據都會寫入到磁碟中

 

如果我直接在調用open()方法的時候像下麵這樣設置buffering為1,就無需擔心緩存的問題了

 

(4)file.seek(offset [,whence])  文件指針

當文件進行寫入或者讀取的時候,文件指針會根據具體的內容進行移動。靈活地運用seek()方法,可以在一次I/O操作中對文件同時進行寫和讀操作,避免多次的I/O。

參數解析:

offset:偏移量,代表需要移動偏移的位元組數

whence:可選參數,預設值為 0。作用是給offset參數設定起始值,表示要從哪個位置開始偏移。0代表從文件開頭開始算起,1代表從當前位置開始算起,2代表從文件末尾算起。

例如以下案例:

file = open('file.txt','a+',1)
for i in range(200):
    file.write('this line is line%s'%i)
    file.write('\r\n')

for line in file:
    print(line)

file.close()

終端沒有列印任何數據

 

如果將代碼順序修改一下

file = open('file.txt','a+',1)
for i in range(200):
    file.write('this line is line%s'%i)
    file.write('\r\n')
file.close()

f = open('file.txt','r+')
for line in f:
    print(line)
f.close()

終端列印出數據

那麼怎麼用seek()方法呢?

import os
file = open('file.txt','a+',1)
for i in range(200):
    file.write('this line is line%s'%i)
    file.write('\r\n')
    file.seek(0,os.SEEK_SET)
    for line in file:
        print(line)
file.close()

同樣也能列印出數據

上面,我用了os模塊的SEEK_SET

os模塊有這些內容:

 os.SEEK_SET:表示文件的相對起始位置

   os.SEEK_CUR:表示文件的相對當前位置

 os.SEEK_END:表示文件的相對結束位置

 

關於fileinput模塊

fileinput可以對文件進行細緻化的處理,比直接的open方法有更多文件操擴展。可以一次性迭代一個或者多個文件,並對文件進行修改。

 

主要的函數有:

1. input([files[,inplace[,backup]]]) 幫助迭代多個輸入流中的行

2. filename()  返回當前文件的名稱

3.nestfile()   關閉當前文件並移動到下一個文件

4. close()     關閉序列(多個文件

5. lineno()    返回(多個文件累計的)當前行號

6. filelineno()  返回在當前文件的行好

7. isfirstline()  檢查當前是否是當前文件中的第一行

8. isstdin()     檢查最後一行是否來自sys.stdin

 

可以理解,fileinput模塊重點是對多文件的讀取和適當時候的修改。而沒有直接的寫操作

 

1. input()方法

這個函數是fileinput模塊中最重要的一個函數,參數相對複雜一點。

官方的定義:

fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])

input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)

1)files列表,可以是一個文件,也可以是多個文件的列表形式

2)inplace  是否對文件進行就地修改。預設為False,設置為False跟文件的open區別不大

3)mode  讀取的格式

官方:FileInput opening mode must be one of 'r', 'rU', 'U' and 'rb'  (b:二進位位元組模式和U:unicode模式)

4)backup  文件備份,為原本的文件做一份備份,不作任何修改,其實就是複製。備份的文件名是原本的文件名+備份文件名。註意備份文件需要把文件的格式也寫進去。一般backup需要與參數inplace一起使用才有意義。而在設置了inplace=True,一般同時會設置backup參數來備份原本的文件內容。

 

 

例子:在每一行文本的前面添加 ‘#行號’字樣

單個文件案例:

for line in fileinput.input('file.txt',inplace=True,mode='r',backup='file_back.txt'):
    num = fileinput.filelineno()
    print('#%s'%num+' '+line)

如果inplace設置為True,即就地修改,必須要有print函數將讀取的數據重新寫回當前的文件中,否則文件的數據最後會變成空。所以使用inplace時候必須很小心。

備份後的文件目錄

 

多個文件案例
for line in fileinput.input(files=['file.txt','file1.txt'],inplace=True,mode='r',backup='file_back.txt'):
num = fileinput.filelineno()
print('#%s'%num+' '+line

 

 

通常fileinput模塊會結合re模塊一起使用,例如在對日誌的分析中會很有用

例如,這裡有一個monoodb的log文件內容

希望獲取日期為11-13的日誌

import fileinput
import re
for line in fileinput.input('mongolog.txt',mode='r',inplace=True,backup='log_backup.txt'):
    pattern = '2018-11-13'
    if re.search(pattern,line):
      print(line)

獲取結果在原log.txt文件中,備份文件中的內容與原文件相同

 


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

-Advertisement-
Play Games
更多相關文章
  • DDD理解 DDD體現的是對現實的充分尊重。 1.尊重業務現實,領域專家、領域語言等概念 2.尊重團隊現實 3.尊重變化 Application 對某一業務線的整體掌控,流程組裝,進度管理,存儲時機掌控。 依賴外部模塊的業務環節實現; 儘量滿足UI需求; 落地:uow提交; Domain 業務線視作 ...
  • 一、概念 繼承的缺點:類數量爆炸、設計死板以及基類加入的新功能可能並不適用於所有的子類。 裝飾者模式:動態地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。一言以蔽之 —— 動態擴展類的行為。 角色:   1、抽象組件(Component):給出一個抽象類 ...
  • 系統架構設計師-軟體水平考試高級-理論-操作系統。其中涉及進程管理(PV操作等),文件管理,存儲管理,設備管理等。 ...
  • 第1章 緒論1.1 概念模型1.2 模式世界1.2.1 Christopher Alexander1.2.2 描述格式1.2.3 關於模式的抽象程度1.3 本書中的模式1.3.1 建模實例1.3.2 模式的來源1.3.3 跨領域的模式1.4 概念模型與業務過程重組1.5 模式與框架1.6 本書的使用 ...
  • 系統: CentOS 7 IP: 192.168.11.199關閉 selinux 和防火牆 # setenforce 0 # 臨時關閉,重啟後失效 # systemctl stop firewalld.service # 臨時關閉,重啟後失效 修改字元集,否則可能報 input/output er ...
  • 歡迎到我的簡書查看我的文集 前言: 是圖形用戶界面,在 中,圖形用戶界面我們用 表示,而 的完整英文為: (圖形用戶介面), 所謂圖形用戶界面就是以圖形的方式來顯示你電腦的操作界面, 我們電腦中操作的界面就是 我們 中常說的圖形用戶界面, 這樣的操作簡單明瞭. 的英文為 , 是命令行用戶介面, ...
  • 51.HashMap的實現原理 HashMap的主幹是一個Entry數組。 Entry是HashMap的基本組成單元, 每一個Entry包含一個key-value鍵值對。 HashMap基於hashing原理, 我們通過put()和get()方法儲存和獲取對象。 當我們將鍵值對傳遞給put()方法時 ...
  • 包導入格式 導入模塊時除了使用模塊名進行導入,還可以使用目錄名進行導入。例如,在sys.path路徑下,有一個dir1/dir2/mod.py模塊,那麼在任意位置處都可以使用下麵這種方式導入這個模塊。 一個實際一點的示例,設置PYTHONPATH環境變數為 ,然後在此目錄下創建以上目錄和mod.py ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...