python學習筆記:第8天 檔案操作

Chocolate、M發表於2018-10-26

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]:

相關文章