1. 程式人生 > >Python檔案(File)及讀寫操作及生成器yield

Python檔案(File)及讀寫操作及生成器yield

open函式在記憶體中建立快取區,將磁碟上的內容複製到此處。檔案內容讀入到檔案物件緩衝區後,檔案物件將緩衝區視為非常大的列表,其中每個元素都有一個索引。檔案物件按位元組(大約每個字元)來對檔案物件緩衝區索引計數。許多檔案方法隱式使用當前檔案位置。例如,呼叫readline方法後,當前檔案位置移動到下一個回車處。write方法在當前檔案位置寫入。

Python方法用於當前位置檔案:
tell()方法:此方法用於當前檔案位置和檔案開始位置之間的相對位置,用位元組進行計算
seek()方法:此方法將當前檔案位置設為檔案物件緩衝區中的新位置,seek方法有兩個引數,第一個引數是位元組數目,第二個引數是引用點。當前檔案指標從引用點開始,移動給出的位元組數目


典型用法:fd.seek(0),將當前檔案位置重置為檔案物件fd的開始位置。

這裡寫圖片描述

當呼叫write(str)時,python直譯器呼叫系統呼叫想把把內容寫到磁碟,但是linux核心有檔案快取機制,經典影視所以快取到核心的快取區,當呼叫close()或flush()時才會真正的把內容寫到檔案

或者寫入資料量大於或者等於寫快取,寫快取也會同步到磁碟上

關閉檔案的目的

1:寫快取同步到磁碟

2:linux系統中每個程序開啟檔案的個數是有限的

3:如果開啟檔案數到了系統限制,在開啟檔案就會失敗

這裡寫圖片描述

如上的程式碼不需要人為的進行close()語句的關閉,當脫離with這段程式碼時(即縮排與with相同),將會自動的進行close操作,如上程式碼可以等價看作:

CSV是一種檔案格式(特別是儲存表格資料,例如excel),實際上是文字檔案,可以使用文字檔案函式和方法。

Python提供了csv模組
要處理CSV格式的檔案,需要一些新的物件。csv.reader物件讀取檔案(使用reader建構函式建立reader物件,引數是檔案物件),csv.writer物件寫CSV檔案,csv.writer物件通過使用方法writerow來將資料行寫入。

小技巧:由於raw_input返回值是字串,因此可以直接用該字串作為open命令的引數

目前流行的作業系統將檔案放於目錄結構中。這個假定的特殊容器,在Linux和OS-X中稱為目錄,在Windows中稱為資料夾,每個目錄完成三件事情:

  • 目錄中有檔案列表
  • 目錄中包含其他目錄的列表
  • 目錄中包含其父目錄的連結

作業系統從根目錄(“/”)開始查詢檔案,沿著樹結構的邊向下移動。不同作業系統中路徑的表示方式略有不同,Linux和MAC OS是“/”表示風格,Windows使用反斜槓(\)表示。

os.getcwd函式,getcwd函式是指獲取當前目錄
os.chdir函式,更改目錄,將當前工作目錄改變為引數所給出的路徑
os.listdir函式,列出路徑引數所指定節點中所有檔案和目錄。函式返回的值可以命名
os.walk函式,遍歷路徑,其中os.walk(“.”)表示從當前目錄開始遍歷
還有split函式,split ext函式和join函式將在如下例子中舉例。
需求如下:
在每個目錄中,檢查該目錄下的每個檔案是否為文字檔案(擴充套件為“.txt”)。如果是文字檔案,郵件格式則開啟它,讀取內容,然後檢視特定字串是否在檔案中。如果找到特定字串,則將檔案新增到檔案列表,將目錄新增到目錄列表。完成檔案搜尋後輸出找到的內容。

(注:在多執行緒的時候可以用yield建立執行緒池)
生成器不會把結果儲存在一個系列中,而是儲存生成器的狀態,在每次進行迭代時返回一個值,直到遇到StopIteration異常結束。
生成器表示式: 通列表解析語法,只不過把列表解析的[]換成()
生成器表示式能做的事情列表解析基本都能處理,只不過在需要處理的序列比較大時,列表解析比較費記憶體。

生成器函式: 在函式中如果出現了yield關鍵字,那麼該函式就不再是普通函式,而是生成器函式。yield 的作用就是把一個函式變成一個 generator,帶有 yield 的函式不再是一個普通函式,Python 直譯器會將其視為一個 generator。

yield 與 return:

在一個生成器中,如果沒有return,則預設執行到函式完畢時返回StopIteration(可以使用next方法來避免阻塞的產生);

如果遇到return,如果在執行過程中 return,則直接丟擲 StopIteration 終止迭代。

close()

手動關閉生成器函式,後面的呼叫會直接返回StopIteration異常。