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