Python3學習筆記 | 九、Python的類型與運算-文件

  • 2019 年 10 月 6 日
  • 筆記

一、文件簡介

文件對象在Python里是可以作為OS(作業系統)上的文件的鏈接。 文件對象的使用方式與之前的字元串、列表等對象不同,它是對文件的輸入、輸出進行控制。 在Python里會用open函數(方法)來進行文件的控制。(也有其它方法可以進行文件的讀取與寫入)

二、文件的訪問

在Python里使用open函數(方法)可以訪問文件。

基本格式是:open([, access_mode])

這裡的文件地址是文本形式,在Windows里,由於文件地址是使用反斜杠(),所以,可以使用r來對反斜杠不進行轉譯。

open(r』C:mydirmyfile』)

訪問模式里是參數,默認是r(讀取),其他方式下面還會有提及。

在訪問模式,每一種方法都有一種使用到b的方式,就是二進位模式。這個在Python 2.x里沒有區別,因為python2.x默認是二進位模式,在Python3.x里默認的字元是unicode方式。

正常使用文本的時候,不需要使用二進位方式,在需要特殊用途的時候是需要以二進位方式來存儲、讀取的。

操作模式:

r 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 rb 以二進位格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。 r+ 打開一個文件用於讀寫。文件指針將會放在文件的開頭。 rb+ 以二進位格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。 w 打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 wb 以二進位格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 w+ 打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 wb+ 以二進位格式打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 a 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 ab 以二進位格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 a+ 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。 ab+ 以二進位格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。

三、文件的使用

• 迭代器是最好的讀行工具 - 比如: 使用for循環 • 內容是字元串,不是對象 - 文件讀取完之後,內容是以字元串的形式讀取的。 • close是通常選項 - 當你使用完文件之後,使用close()方法來關閉文件關聯。 • 文件是緩衝的而且是可查找的 - flush或close()方法可以直接存儲快取里的內容, seek方法可以轉到指定位置。 當我們使用文件的時候,跟其它對象一樣,用一個變數來引用。

>>> file = open('./test.txt','w')

然後對變數進行操作

>>> file.write('DoraEmon')  8

在這裡,Python3.x是有返回輸入長度,但Python2.x是沒有的。

>>> file.close  >>> file = open('./test.txt','r')  >>> file.read()  'DoraEmon'

四、文件的讀取

1、最基本的讀取

讀:當我們以r的模式讀取文件後,可以用以下方法來讀取內容。

PS C:UsersAdministrator>cat C:Testtest.txt  Dora  Emon

這裡先是有一個提前創建的文件,文件名叫test.txt,在C:Test目錄下。 read()方法就是從頭到尾讀一遍。剛剛讀取文件後,其指針在最前面,讀完之後指針在最後面,指針位置可以用tell()方法來查看。

>>> output = open(r'C:Testtest.txt')  >>> output.tell()  0  >>> output.read()  'DoranEmon'  >>> output.tell()  10

2、按需求讀取

當我們需要只讀取前4個字元,讀到Dora:

>>> output = open(r'C:Testtest.txt')  >>> output.read(4)  'Dora'  >>> output.tell()  4

之後,就是從指針所指的地方開始讀取:

>>> output.read()  'nEmon'

我們也可以按行讀取:

>>> output = open(r'C:Testtest.txt')  >>> output.readline()  'Doran'  >>> output.readline()  'Emon'

也可以使用一個函數,把指針隨意放在想要的位置,然後讀取:

>>> output.seek(4)  4  >>> output.tell()  4  >>> output.read()  'nEmon'

五、文件的寫入

1、基本寫入

當我們需要寫入到一個文件的時候,會使用w模式。當相應的文件存在時,會清空原先的文件然後寫入,當相應的文件不存在時會創建新的文件。

>>> input = open(r'C:Testinput_test.txt','w')  >>> input.write('Dora Emon')  9  >>> input.write('DaXiong And JingXiang')  21  >>> input.flush()  >>> input.close()PS C:UsersAdministrator> cat C:Testinput_test.txt  Dora EmonDaXiong And JingXiang

在這裡,flush()方法是把快取里的內容寫入硬碟中。當運行close()方法的時候,也會進行同樣操作。

2、按列表內容寫入

>>> lines = ['DoraEmonn','DaXiong And JingXiangn']  >>> input = open(r'C:Testinput_test.txt','w')  >>> input.writelines(lines)  >>> input.close()PS C:UsersAdministrator> cat C:Testinput_test.txt  DoraEmon  DaXiong And JingXiang

writelines是把列表裡的元素一個一個輸入進去。當然,元素里的字元串最後沒有換行,最終結果也不是換行的。

3、在特定位置寫入

>>> input = open(r'C:Testinput_test.txt','w')  >>> input.write('Dora')  4  >>> input.seek(0)  0  >>> input.write('Emon')  4  >>> input.close()PS C:UsersAdministrator> cat C:Testinput_test.txt  Emon

這裡的話,當我們輸入錯誤的時候,可以把指針挪到最前面,然後繼續輸入。seek可以有兩個傳遞變數,只有一個變數時,就是更改當前的指針,或者第一個變數為0,第二個變數為1的時候,會返回當前指針位置,這個與tell方法同樣。最後,第一個變數為0,第二個變數為2的時候會把指針放到最後。

4、在最後寫入

之前看到的w模式,當文件是已有文件,就會刪除裡面的所有內容後再寫入的。當我們需要在最後添加,而不是刪除原有內容時,可以使用a模式。

>>> file = open(r'C:Testtest.txt','r')  >>> file.read()  'DoranEmon'  >>> file.close()  >>> file = open(r'C:Testtest.txt','a')  >>> file.write('DaXiong')  7  >>> file.close()PS C:UsersAdministrator> cat C:Testtest.txt  Dora  EmonDaXiong

我們會看到,a模式不會去更改原來的文件,而且每次寫入也不會更改之前寫入的內容。

六、文件的讀寫

在模式里,我們會看到r+, w+, a+ 三種模式都有讀寫的方法。 r+模式,只能打開已有文件,打開時保留原有文件,對文件可讀,可寫,也可更改原有內容。打開時指針在文件最前面。 w+模式,打開時沒有相應文件,會創建;有相應文件,會刪除裡面所有內容後打開。之後的操作與r+完全相同。 a+模式,可以打開原有文件,也可創建新的文件,打開時指針為文件的最後位置。指針可以放到任何位置來讀內容,但寫入時,指針默認會移動到最後,然後寫入。

模式 打開已有文件 打開新的文件 打開時指針位置 寫入時指針位置 r+ 保留內容 發生錯誤 文件開頭 當前位置 w+ 刪除內容 創建文件 文件開頭 當前位置 a+ 保留內容 創建文件 文件尾端 文件尾端

其餘模式可參考https://blog.csdn.net/qq_35203425/article/details/80904428

七、文件的訪問 – b模式

在Python里可以使用二進位方式讀取和寫入文件。 這個模式,在Python2.x里不會有什麼特別,因為在2.x里存儲方式就是二進位方式。

>>> a = '啊'  >>> a  'xe5x95x8a'

但是在Python3.x里是unicode方式:

>>> a = '啊'  >>> a  '啊'

所以在存儲的時候,我們可以使用二進位模式,或者正常模式。

>>> a='啊'.encode()  >>> a  b'xe5x95x8a'

這之後,可以使用二進位方法來存儲。

八、文件與其他類型 – 原生對象的存取

存儲一些對象的時候,比如說列表,字典等;Python都需要把這些對象轉換成字元串後存儲:

>>> file = open(r'C:Testtest.type','w')  >>> file.write({'a':97})  Traceback (most recent call last):   File "<stdin>", line 1, in <module>  TypeError: write() argument must be str, not dict  >>> file.write(str({'a':97}))  9  >>> file.write(str([1,2]))  6  >>> file.close  <built-in method close of _io.TextIOWrapper object at 0x00000256209BF558>PS C:UsersAdministrator> cat C:Testtest.type  {'a': 97}[1, 2]

這樣,讀取的時候會出現我們得再次轉換的問題,這個時候,我們可以用pickle模組:

>>> import pickle  >>> file = open(r'C:Testtest.type','wb')  >>> a = {'a',97}  >>> pickle.dump(a,file)  >>> file.close()PS C:UsersAdministrator> cat C:Testtest.type  €cbuiltins  set  q ]q(KaX   aqe卶Rq.    >>> file = open(r'C:Testtest.type','rb')  >>> a = pickle.load(file)  >>> a  {97, 'a'}PS C:UsersAdministrator> cat C:Testtest.type  {'a': 97}[1, 2]  q ]q(KaX   aqe卶Rq.

pickle.dump(obj, file[, protocol]) 序列化對象,並將結果數據流寫入到文件對象中。參數protocol是序列化模式,默認值為0,表示以文本的形式序列化。protocol的值還可以是1或2,表示以二進位的形式序列化。 pickle.load(file) 反序列化對象。將文件中的數據解析為一個Python對象。 關於pickle模組詳細介紹可以參考https://blog.csdn.net/sxingming/article/details/52164249

九、文件操作中會用到的其它工具

在Python里,我們可以使用os模組里的方法對文件進行操作:

PS C:UsersAdministrator> cd C:Test  PS C:Test> echo '' > file  PS C:Test> ls     目錄: C:Test  Mode                LastWriteTime         Length Name  ----                -------------         ------ ----  -a----        2019/1/29     16:35              6 file    >>> import os  >>> os.rename(r'C:Testfile',r'C:Testfile2')  #重命名文件      PS C:Test> ls     目錄: C:Test  Mode                LastWriteTime         Length Name  ----                -------------         ------ ----  -a----        2019/1/29     16:35              6 file2    >>> os.remove(r'C:Testfile2')  #刪除文件    PS C:Test> ls  #此時因為file2已經被刪除了,文件夾沒有文件了,因此並沒有ls出來結果      >>> os.getcwd()  #獲取當前工作路徑  'C:\Users\Administrator'  >>> os.chdir(r'C:Test')  #改變工作目錄  >>> os.getcwd()  'C:\Test'

其他關於os模組的詳細用法可以參考https://www.cnblogs.com/cherishry/p/5725977.html