首頁  >  文章  >  後端開發  >  python之文件處理的詳細介紹

python之文件處理的詳細介紹

高洛峰
高洛峰原創
2017-03-22 10:38:211528瀏覽

在python中如果想對硬碟中的一個檔案進行操作大概可以分為三步,它的流程如下:

使用open函數開啟一個檔案句柄,並且賦值給一個變數。

透過對應的檔案句柄對指定的檔案進行操作。

操作完成後關閉文件,文件關閉後,會將文件內容寫入磁碟。

open函數的使用方法如下。

open('檔案路徑',mode='開啟檔案的模式',encoding='檔案編碼方式')

檔案路徑:這個檔案路徑可以是絕對路徑,也可以是相對路徑,在python中相對路徑只需要寫文件名就可以了,如果python程式和需要大開的文件如果在一個目錄的話,直接使用相對路徑就可以了。

注意!如果要使用open函數,檔案路徑是必要參數,不可以不傳!

開啟檔案的模式:open函數裡面有一個非必要形參,就是mode,它用來定義檔案的開啟模式,如果不指定檔案開啟模式,預設會使用r(唯讀)模式開啟檔案。

python中所提供的常用文件開啟方式如下:

'r' 以唯讀模式開啟文件,使用r(唯讀模式)開啟文件,文件只能讀,不能做寫入操作。 (文件不存在,則拋出異常)

'w'以只寫模式打開文件,使用w(只寫模式)打開文件,文件只能寫,不能讀取,不過有一點需要特別注意! ! ! ! !原本就有內容的文件,一旦使用w打開,那麼這個文件的內容就會被清空! ! (至於原因,本文後面會補充。)(如果不想文件原來的內容被清空!!那麼千萬不要使用w模式!!!!!!!)(文件不存在時,會創建一個文件,如果文件存在,則會先清空文件內容)

'a' 追加模式,也是一種只寫模式,用於在問價的尾部追加內容,所寫入的內容都會追加到文件的末尾處

       'b' 二進位模式,使用二進位的方式來開啟文件,並注意!這個‘b’(二進位模式)是要與(r,w,a)三種模式組合使用的。 (跨平台跨作業系統建議使用此模式)

    'r+' 可讀可寫(在此模式下,雖然可讀可寫,但是寫的時候一定要注意,seek指針還在文件的頭部,如果沒有調整seek指針的位置直接開始寫入,會直接開始覆蓋前面寫的內容(從文件頭部開始),所以說,在使用r+模式的時候,一定要注意seek指針的位置,在文件的什麼地方! a+' 末尾追加,可寫可讀

一.對檔案物件進行操作的常用方法

讀取檔案:

readable()用於判斷檔案是否可讀,如果可讀返回True,否則返回False。

readline() 一次讀取檔案的一行,傳回字串型別。

read()一次讀取檔案所有的內容,傳回一整個字串。

readlines()讀取檔案的所有內容,並將檔案的每一行內容加入到一個清單裡面,檔案的每一行內容都會作為清單中的一個元素。

寫檔案:

writable():判斷檔案是否可寫,如果可寫,回傳True,否則回傳False。

write():在檔案中寫入內容,只有當檔案處於可寫的模式,才可以使用此方法,具體在檔案的什麼位置寫,則取決於檔案的開啟模式(是r+還是a+或是w+)還有取決於目前的seek指標所指向檔案的什麼位置。 (在補充一點,使用write方法向文件內部寫內容,是沒有換行符的,需要手動添加個換行符,不然所有的內容都會粘到一起。)

例:f1.write(' hello!\n') #\n就是換行符號。

writelines():和wirte類似,都是向文件內部寫入內容,和write不同的是,writelines是使用列表的形式來對文件內部寫入內容,使用writelines方法,python會將列表循環,列表中的每個元素都會寫入到文件中。

注意!使用writelines對檔案內部寫內容時,也是不帶換行符的,如果給每個元素的尾部都加個換行符,那麼列表中的每一個元素都是文件中的一行。

注意! !在文件中寫入的內容只能是字串,不可以是其他類型! !否則會拋出異常,就算要寫入數字,那麼這個數字也一定要轉換成字串類型! ! !

其他操作:

close()關閉文件,當文件使用讀完或寫完後一定要使用close關閉文件! (使用with語法除外,因為使用with關鍵字開啟文件,對文件的操作結束後,會自動關閉文件)。

讀完檔案後不關閉,程式會一直佔用系統資源。

寫完文件後不關閉,會導致記憶體中的內容不會及時的同步到硬碟中,若想把內容徹底寫到硬碟,要不然就使用close關掉文件,要不然,就使用flush方法強制把記憶體中的資料刷到硬碟上。

flush()將記憶體中沒有寫到硬碟上的數據,強刷到硬碟中。

encoding:顯示檔案開啟的編碼(在python2中沒有這個方法,在python3中可以使用。)

tell():可以取得目前seek指標的位置。

seek(指針位置 ,模式)以位元組為單位,移動seek指針,在檔案中的位置。

在pyrhon中對seek指針的操作有三種模式,下面對這三種模式進行一個詳細的介紹:

file.seek(n,0)#n代表了指針的位置,後面的數字0代表的是模式的序號。

file.seek(n,0):(模式0)模式0代表了,絕對位置,n為幾,就會把指標移到從檔案開頭開始算數的第幾個位元組。 (使用seek時,如果不指定模式,那麼預設的模式就是0。)

比如說file.seek(3,0) 將指標移到從檔案的開頭(第0個位元組)開始數,三個位元組的位置。

#沒使用指標之前

f1 = open('seasons.lrc',mode='r')

print f1.readline()

#>>>浜崎あゆみ- Seasons

#下面是使用0模式,將指針移到檔案的第3個字節,將指針移到第3個位元組以後,在去讀文件,就會從指針的後面開始讀取文件。

f1 = open('seasons.txt',mode='r')

print f1.tell() #顯示seek指標目前的位置

> >>0 #(位置是0,代表指針在文件的開頭)

f1.seek(3,0)    #(將指針移到第三個字節處,使用0模式,絕對位置)

print f1.tell()   #再次查看指標位置,可以驗證指標的位置確實被移動到了第三個位元組。

>>>3

print f1.readline()  #從目前指標的位置後面讀取一行。

>>>崎あゆみ- Seasons

這時可能有人要問了,讀文件是從指針的後面開始讀的沒錯,但是明明把指針移到了三個位元組之後啊,為什麼才跳過了一個字元?

這就需要了解什麼是字元和位元組了,一定要清楚這個概念! !在utf-8的字符編碼中,一個漢字會佔用三個字節,原來第一行的內容是“浜崎あゆみ- Seasons”,因為一個漢字佔了三個字節,所以指針被向後移動了三個字節,剛好是一個漢字的位置,指針被移到了「浜」後面,讀文件的話,就從這個字後面開始讀, 所以顯示的就是「崎あゆみ- Seasons」。 (一個日文字在utf-8字​​元編碼中也佔三個位元組。)

後面在舉個例子,這個例子可以明白「絕對位置」的意思。

f1 = open('seasons.lrc',mode='r')

print f1.tell()  #開啟檔案後,指標預設的位置是0。

>>>0

f1.seek(3,0)  #將指移到檔案中3個位元組的位置。

print f1.tell()

>>>3

f1.seek(3,0)

print f1.tell( )

>>>3

file.seek(n,1): (模式1)模式1,相對位置,n代表了指針在當前位置向後移動幾個位元組。

如果覺得我說的不太容易懂的話,估計看下後面的例子,就懂了。

f1 = open('seasons.lrc',mode='r')

print f1.tell()   #開啟檔案後,指標預設的位置是0。

>>>0

f1.seek(3,1)  #將指標向後移動3個位元組的位置。

print f1.tell()

>>>3     #指標移動到了第3個位元組的位置。

f1.seek(3,1)  #這裡是重點了,將指標在向後移動3個位元組(在這個地方就可以比較出模式1和模式0的區別了。)

print f1.tell()

>>>6   #指標的位置在第6個位元組上,這也說明了,1模式每次移動,並不是從文件的開頭開始算起,而是根據指針上次所在的位置開始向後移動。 (這也就是「相對位置」的意思。)

如果還看不懂,那就看下面的補充。

最後在補充:

f1.seek(3,0) 是指,將指標移到檔案第3個位元組的位置。 (絕對位置)

f1.seek(3,1) 是指,將指標從目前位置向後移動3個位元組的位置。 (相對位置)

file.seek(-n,2): 以絕對位置,從檔案最末端開始,往檔案的開頭移動。 (使用2模式時,需要注意,指針移動的位置只能是負數,因為是從最末尾開始向前移動!)

下面是例子:

###打開一個文件,使用read方法從頭讀到文件的尾部,當文件被讀完,指針自然地回到文件的末端。

f1 = open('seasons.txt',mode='r')

print f1.tell()

>>>0

# f1.read()

print f1.tell()

>>>756

現在透過上面的方法已經知道,檔案的最末尾是文件的第幾個位元組。

下面來測試下seek方法的2模式的功能是否如之前所說,從文件最末尾開始,向文件的開頭移動。

f1 = open('seasons.txt',mode='r')

#print f1.tell()

>>>0

f1.seek(-1,2)  #使用seek的2模式,將指標從檔案的最末端向前移動1個位元組

print f1.tell()

#>>>755

#檔案的最末端是756,向前移動了一個位元組就是755,得到了我們想要得到的效果。

其實seek方法的2模式還是比較有用的,下面就細說下seek方法的2模式。

在取得檔案的倒數第1行到第N行,就可以使用seek方法的2模式。

這時可能會有人問,取出文件的最後一行,豈不是很簡單的操作,只要用readlines方法把文件都讀出來,然後取最後一個元素,就可以取到最後一行了,這種方法豈不是比較簡單?

像這樣。

f1 = open('seasons.txt',mode='r')

#print f1.readlines()[-1]

>>>そして何を?つけるだろう

文件的最後一行確實被取出來了,但是,有沒有想過,這種使用readlines讀取文件的本質,是把文件的每一行全部內存讀到中,如果這個文件特別大,比如說10個G,100G,大到目前的內存放不下,如果是這種情況,這種方法就不適用了。

下面這種方法,對於大檔案就特別適用了。

f1 = open('seasons.txt',mode='r')

for i in f1:      #直接for循環檔案句柄,不會一次把檔案都讀到內存,而是讀一行從文件中取一行。

    line_bytes = -36

    while True:

        f1.seek(line_bytes,2)

        數據 = f1.readlines() ##        if len(data) > 1:

            print data[-1]

         #   line_bytes * 2

以上是python之文件處理的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn