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
方法開啟檔案時,檔案模式需要包含w
,a
或者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 列表給震撼了,使用這個模組幾乎可以完成所有的日常檔案和目錄操作。為方便以後查詢,我專門將這些常用的操作分門別類,做了一個思維導圖。一起來看下。
上圖中只給出了最簡單的功能介紹,如果想要深入瞭解具體的方法使用,可參考 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
啊 ^_^
- 看上面的 os 思維導圖,也有一個刪除目錄 API
對我來說,這三種常用的操作就可以了。當然 shutil
的功能遠比這些要豐富的多,有興趣的同學,可以到 官方文件 去深入瞭解下。
小結
本篇主要介紹了 python 中檔案常用的操作,內容包括開啟檔案,讀檔案,寫檔案,使用 os
和 shutil
模組來操作檔案和目錄。下篇會介紹 json
和 xml
處理,敬請期待。