[TOC] 前言 在 "上篇文章" 中,全面講解了 python 3 中 的面向對象,今天我會繼續探險,去掌握 python 3 中的文件操作, let's go 讓我們出發吧! 文件 什麼是文件? 一談到文件,就會涉及到一個的重要的概念, 持久化 。什麼是持久化? 持久化是將程式數據在 "持久" ...
目錄
前言
在上篇文章 中,全面講解了 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
處理,敬請期待。