1. 程式人生 > >python 歷險記(三)— python 的常用檔案操作

python 歷險記(三)— python 的常用檔案操作

目錄

前言

上篇文章 中,全面講解了 python 3 中 的面向物件,今天我會繼續探險,去掌握 python 3 中的檔案操作, let's go 讓我們出發吧!

檔案

什麼是檔案?

一談到檔案,就會涉及到一個的重要的概念,持久化 。什麼是持久化?

持久化是將程式資料在持久狀態和瞬時狀態間轉換的機制。通俗的講,就是瞬時資料(比如記憶體中的資料,是不能永久儲存的)持久化為持久資料。 ——來源於百度百科

由此可見,持久化資料就是在程式執行結束後或者斷電後再開機,還繼續存在的資料。而檔案就是最典型的表現形式。那什麼是檔案呢?

檔案就是儲存在如硬碟,光碟這樣的非易失媒介上的資訊序列。像記憶體,在關機或掉電後,資訊就全部丟失了,檔案當然不會儲存在它上面。

當我們想要讀或者寫檔案時,就得先開啟(open) 檔案才可以,而當讀寫完成的時候,也要儘量將其關閉(close),這樣才能夠釋放它佔用的系統資源啊。

如何在 python 中開啟檔案?

使用內建函式 open 就可以開啟檔案。先來看下 python 中對 open 函式的定義

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

引數定義如下

  • access_mode 表示檔案模式。常見的模式有讀模式,寫模式,追加模式等。這個引數是可選的,如果不填,預設就是讀模式。具體的檔案模式列表在下面表格中列出。
  • buffering 快取標誌
    • 如果不填,預設值為 0
    • 值為 1 表示行快取
    • 值 > 1 則代表緩衝區的大小(單位是位元組)
    • 值 < 0 表示使用預設快取區的大小
  • file_name 表示要訪問的檔案路徑名稱,可以是相對路徑,也可以是絕對路徑。

具體的檔案模式 access_mode 引數表如下

功能描述
w 寫模式
r 讀模式
x 寫模式,建立一個檔案,如果檔案已存在,則報錯
a 追加模式
b 二進位制模式(可與其他模式結合使用)
+ 讀/寫模式(可與其他模式結合使用)

其中 b 或者 + 可與其他模式結合使用需要說明下:

  • rb 就表示讀取一個二進位制檔案
  • w+ 表示對開啟的檔案可讀可寫
  • wb+ 則表示對二進位制檔案可讀可寫,如果模式中不加 b則預設表示文字檔案

呼叫 open 函式後返回的是什麼物件呢?能夠從這個物件中獲取什麼資訊和執行什麼操作呢?來看下一節

python 檔案物件有哪些屬性?

呼叫 open 函式後返回的是一個檔案控制代碼,這個控制代碼中包含許多檔案相關的屬性,具體如下面表格所示

屬性 功能描述
file.closed 檔案是否已關閉,是則返回 true
file.mode 開啟檔案時使用的模式
file.name 檔名稱

來看一個例子

f = open('test.py', 'r+')

# 檔名稱.
print ("File name: ", f.name) # test.py
# 檔案是否已關閉
print ("File state: ", f.closed) # False
# 檔案開啟時的模式
print ("Opening mode: ", f.mode) # r+

開啟檔案後,最常見的操作就是讀檔案和寫檔案了,先來看讀檔案

如何讀檔案?

在讀取檔案時, 最常用的方法就是 read()readlines() 兩個方法,在操作結束後都要呼叫 close() 方法關閉檔案,釋放資源。

先來看 read() 方法

read()

開啟檔案後,

  • 呼叫 read(size) 方法可以一次讀取 size 位元組的資料

  • 如果read()方法中沒有引數可以一次將檔案內容全部讀入到記憶體中

來看一個例子,假設有一個檔名稱為 a.txt 內容為

Good morning, everyone!
Good morning, my student!

先來讀取前 4 個字母

try:
  f = open('a.txt', 'r')
  print(f.read(4)) # Good
finally:
  if f:
    f.close()

上面程式碼為什麼要用 try ... finally 包裹呢?

這是因為檔案操作很可能出現 IO 異常的情況,需要使用 try ... finally 包住,即使出現異常也能保證 close() 方法能夠正常呼叫。

其實還有更簡潔的寫法,就是使用 with 語句,它就是一個語法糖,一下就把 try ... finally 的活都幹了。來感受下它的威力

with open('a.txt', 'r') as f:
  print(f.read(4)) # Good

readline()

對於文字檔案來說,如果比較大,使用 readline() 方法則更為合理,可以一次讀取一行內容。

with open('a.txt', 'r') as f:
  print(f.readline()) # Good morning teacher!

如果一次想返回多列文字,可以使用 readlines() 方法,它會返回一個列表。

with open('a.txt', 'r') as f:
  print(f.readlines()) # ['Good morning teacher!\n', 'Good morning, my student!']

如何寫檔案?

寫檔案和讀檔案操作非常類似,它們的區別就在於:

  • 呼叫 open 方法開啟檔案時,檔案模式需要包含 wa或者 x

注意, 使用 w 模式開啟檔案後,執行寫入操作,如果檔案已經存在,則會將之前的檔案內容全部覆蓋,之前的資料內容就丟失了啊。如果不想覆蓋,還是使用 a 模式開啟吧。

呼叫什麼方法可以寫檔案呢? write()方法,呼叫成功後,會返回寫入檔案的字元長度。

來看一個例子

with open('a.txt', 'w') as f:
  f.write('I am line 1\n')
  f.write('I am line 2\n')

上面程式碼中,為什麼要加 \n 呢?這是用來分行的,要不然都擠在一行了。

注意,這裡如果不使用 with 語法糖,也一定要顯式的呼叫使用 close 方法。這不僅僅是因為釋放資源的原因:在呼叫 write() 方法時,作業系統不會立刻將資料寫入到檔案中,而是先在記憶體中快取,等到空閒時再寫入檔案,最後使用 close() 方法才會將資料完整的寫入到檔案中。

當然,顯式呼叫 flush() 方法也可以將資料立即寫入檔案中。綜合比較,還是推薦使用 with 的方式,優雅且完善。

如何操作檔案和目錄?

除了對檔案讀和寫之外,還會經常用到如獲取檔案路徑,檢視檔案大小,重新命名,刪除檔案等檔案或目錄操作。這些操作應該呼叫哪些方法來完成呢?

強大的 os 模組

剛開始接觸 os 模組,就被它強大的 API 列表給震撼了,使用這個模組幾乎可以完成所有的日常檔案和目錄操作。為方便以後查詢,我專門將這些常用的操作分門別類,做了一個思維導圖。一起來看下。

os 模組 API 思維導圖

上圖中只給出了最簡單的功能介紹,如果想要深入瞭解具體的方法使用,可參考 python 3.6 os 模組官方地址

學習有時候就是這樣,API 太多根本記不住,也沒有必要完全記住,只要經常歸納整理,知道要使用的操作在什麼地方,叫什麼名字,用到的時候去查就可以了。

shutil 模組— High-level file operations

除了 os 模組,還有一個非常有用的模組 shutil ,它的定位是針對多個檔案的高階檔案操作(High-level file operations)。相比而言, os 模組大多是對單個檔案而言的嘍。下面通過幾個常用的操作來感受下:

  • 複製資料夾 shutil.copytree('olddir', 'newdir')
    • 注意, 引數olddir ,newdir 只能是目錄,而且 newdir 這個目錄不存在才可以
  • 移動檔案或目錄 shutil.move('oldpath','newpath')
  • 刪除目錄 shutil.rmtree('dir')
    • 看上面的 os 思維導圖,也有一個刪除目錄 API os.rmdir(dir) ,只能刪除空目錄
    • shutil.rmtree 功能則更高階,無論是空還是非空目錄都可以刪除,確實是 High-level 啊 ^_^

對我來說,這三種常用的操作就可以了。當然 shutil 的功能遠比這些要豐富的多,有興趣的同學,可以到 官方文件 去深入瞭解下。

小結

本篇主要介紹了 python 中檔案常用的操作,內容包括開啟檔案,讀檔案,寫檔案,使用 osshutil 模組來操作檔案和目錄。下篇會介紹 jsonxml 處理,敬請期待。

相關文章列表