1. 檔案操作介紹
說到操作檔案我們肯定會想到流,檔案的操作都是通過流來操作的。在python中檔案的操作非常簡單,並不像Java等其他語言一樣有各種各樣的流操作,我們直接使用open函式即可開啟一個檔案,然後進行各種操作,但是根據開啟的不同的方式所能夠執行的操作也不一樣,開啟檔案的方式有:r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 等等。
下面我們先看一個讀取的檔案操作:
In [2]: f = open(file=`a.txt`, mode=`r`, encoding=`utf-8`)
In [3]: f.read()
Out[3]: `每天堅持一點,
每天努力一點,
每天多思考一點,
慢慢你會發現,
你的進步越來越大
`
In [4]:
使用open函式開啟檔案,並且返回一個檔案物件,open函式常見的幾個引數file(要操作的檔名),mode(以什麼模式開啟)和encoding(指定一種編碼來讀取檔案),根據不同的mode模式,返回的檔案會有各種不同的操作。下面我們來看一下檔案的幾種操作。
2. 檔案操作的幾種方式
(1)只讀操作
只讀操作只需指定mode為r即可:
In [5]: f = open(file=`a.txt`, mode=`r`, encoding=`utf-8`)
In [6]: f.read()
Out[6]: `每天堅持一點,
每天努力一點,
每天多思考一點,
慢慢你會發現,
你的進步越來越大
`
In [7]: f.readable() # 判斷檔案是否可讀
Out[7]: True
In [8]: f.writable() # 判斷檔案是否可寫
Out[8]: False # 此處是以只讀模式開啟的檔案,所以返回False不可寫
In [9]: f1 = open(file=`單分支結構.eddx`, mode=`rb`) # 使用‘rb’可以開啟儲存為二進位制的資料,圖片、視訊等
In [10]: f1.read(20)
Out[10]: b`PKx03x04x14x00x08x00x08x00mNxe3Hxa9x95xb3x9eWx01`
(2)只寫操作
mode=`w`
In [13]: f = open(file=`a.txt`, mode=`w`, encoding=`utf-8`)
In [14]: f.read() # 此時嘗試讀取檔案會報錯
---------------------------------------------------------------------------
UnsupportedOperation Traceback (most recent call last)
<ipython-input-14-571e9fb02258> in <module>
----> 1 f.read()
UnsupportedOperation: not readable
In [15]: f.write(`葫蘆娃`)
Out[15]: 3
In [16]: f.close()
In [17]: !cat a.txt # 此時檢視檔案之前那的內容已經被覆蓋了
葫蘆娃
In [18]:
使用mode=`w`
操作檔案時首先會在開啟檔案時先清空檔案,然後再根據操作把內容寫入檔案,只讀模式有以下特點:
- 當檔案不存在時,會自動建立檔案,然後開啟檔案進行操作
- 開啟檔案時會先清空檔案的內容,然後再從頭開始寫入
- 檔案以只寫模式開啟,不能夠讀取
(3)追加操作
mode=`a`
In [18]: f = open(file=`a.txt`, mode=`a`, encoding=`utf-8`)
In [19]: f.write(`每天堅持一點,
每天努力一點,
每天多思考一點,
慢慢你會發現,
你的進步越來越大
`)
Out[19]: 42
In [20]: f.close()
In [21]:
In [21]: !cat a.txt
葫蘆娃每天堅持一點,
每天努力一點,
每天多思考一點,
慢慢你會發現,
你的進步越來越大
In [22]:
追加模式的操作:
- 開啟檔案時如果檔案不存時會先建立檔案
- 往檔案中寫入內容時都是在檔案末尾寫入,不論游標在哪
- 開啟的檔案只能寫入,不能讀取
(4)r+模式
r+
模式是加強的讀操作,即可以讀寫:
In [22]: f = open(file=`a.txt`, mode=`r+`, encoding=`utf-8`)
In [23]: f.readable()
Out[23]: True
In [24]: f.writable()
Out[24]: True
In [25]: f.read()
Out[25]: `葫蘆娃每天堅持一點,
每天努力一點,
每天多思考一點,
慢慢你會發現,
你的進步越來越大
`
In [26]: f.write(`
哈哈哈哈哈哈哈`)
Out[26]: 8
In [27]: f.close()
In [28]: !cat a.txt # 檢視寫入的檔案並沒有異常
葫蘆娃每天堅持一點,
每天努力一點,
每天多思考一點,
慢慢你會發現,
你的進步越來越大
哈哈哈哈哈哈哈
In [29]: f = open(file=`a.txt`, mode=`r+`, encoding=`utf-8`)
In [30]: f.seek(0, 2) # seek可以調整游標位置
Out[30]: 153
In [31]: f.write(`你的進步越來越大`)
Out[31]: 8
In [32]: f.read() # 先寫後讀會讀出空字元
Out[32]: ``
In [33]:
總結:增強型的讀操作對檔案可讀可寫,但是順序必須是先讀取在往裡面寫入,如果先讀再寫入再讀取的時候可能會讀取到空字串
r+模式深坑請注意: 在r+模式下. 如果讀取了內容. 不論讀取內容多少. 游標顯⽰的是多少. 再寫入或者操作⽂件的時候都是在結尾進⾏的操作
(5)w+和a+模式
w+模式和a+模式在實際使用場景較少,這邊簡單介紹一下:
- w+:增強型的w模式,可以寫和讀操作,但是也跟r+一樣,如果先讀操作再寫操作的話會有坑出現,並且每次在開啟檔案是會先清空檔案,因此使用場景較少
- a+:增強型的a模式,也可以進行讀寫操作,但是寫入時只能往檔案的末尾寫入,無論游標怎麼移動,都只能在檔案末尾寫入
3. 檔案的操作的方法
(1)檔案的讀取和寫入
檔案的寫入:主要是write方法以及writelines方法
- write方法:直接寫入字串即可,上面的例子中也有用到
- writelines方法:傳遞的引數必須時可迭代的(如列表和元組等)
檔案的讀取:
- read方法:read方法接收一個int型的引數,表示一次讀取幾個字元(seek的單位是位元組),不提供預設是讀取檔案所有內容
- readline方法:讀取檔案一行,檔案很大時這個方法很使用,不會一次讀取整個檔案
- readlines方法:讀取出整個檔案,以每一行分割存放到一個列表裡並返回這個列表
In [34]: f = open(file=`a.txt`, mode=`r`, encoding=`utf-8`)
# 葫蘆娃每天堅持一點,
# 每天努力一點,
# 每天多思考一點,
# 慢慢你會發現,
# 你的進步越來越大
# 哈哈哈哈哈哈哈你的進步越來越大
In [35]: f.read(10) # 這裡時一次讀取10個字元
Out[35]: `葫蘆娃每天堅持一點,`
In [36]: f.readline()
Out[36]: `
`
In [37]: f.readline() # 每次讀取一行
Out[37]: `每天努力一點,
`
In [38]: f.readlines() # 返回的是一個列表
Out[38]: [`每天多思考一點,
`, `慢慢你會發現,
`, `你的進步越來越大
`, `
`, `哈哈哈哈哈哈哈你的進步越來越大`]
In [39]:
readline(檔案控制程式碼)和readlines的區別
- 檔案控制程式碼是一個可迭代物件,在迴圈遍歷時每遍歷一次取一行,不會在讀取檔案時一次性全部讀出來
- readlines返回的結果是一個列表,會一次性把整個檔案的內容讀取出來並返回一個列表,在處理大檔案時會非常消耗資源
也可以使用迴圈去遍歷檔案控制程式碼,輸出檔案中的內容:
In [39]: f.seek(0)
Out[39]: 0
In [40]: for line in f:
...: print(line.strip())
葫蘆娃每天堅持一點,
每天努力一點,
每天多思考一點,
慢慢你會發現,
你的進步越來越大
哈哈哈哈哈哈哈你的進步越來越大
In [41]:
(2)檔案操作的其他方法
- close:關閉檔案
- readable:判斷檔案是否可讀
- seek:移動游標,接收兩個資料第一個參數列示偏移到哪個位置(移動的單位是byte. 所以如果是UTF-8的中⽂部分要是3的倍數),第二個參數列示從那個位置開始偏移(0,代表開頭,1代表當前位置,2代表結尾)
- seekable:判斷當前檔案的游標是否可移動
- tell:返回當前游標所在的位置
- truncate:截斷資料(謹慎操作),預設截斷游標後所有字元
- writable:判斷檔案是否可寫
(3)開啟檔案的另一種方式
在開啟一個檔案後,要記得在檔案使用結束狗使用close方法關閉檔案控制程式碼,但有時在中間進行大量的操作後可能會忘了關閉,下面介紹的這種方法可以不用自己手動關閉檔案了,他會在您操作解說後(程式碼塊的語句執行完畢)自動關閉檔案控制程式碼,這種方法就是使用context上下文管理,使用with語句實現:
In [43]: with open(`a.txt`, mode=`r`, encoding=`utf-8`) as f: # 使用with管理上下文,最後退出時會自己執行close動作
...: for line in f:
...: print(line.strip())
葫蘆娃每天堅持一點,
每天努力一點,
每天多思考一點,
慢慢你會發現,
你的進步越來越大
哈哈哈哈哈哈哈你的進步越來越大
In [44]: