學習知識要善於思考,思考,再思(考)。我就是靠這個方法成為科學家的。——愛因斯坦
open() 方法
Python open() 方法用於打開一個文件,並返迴文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSError。
注意:使用 open() 方法一定要保證關閉文件對象,即調用 close() 方法。
open() 函數常用形式是接收兩個參數:文件名(file)和模式(mode)。
一般用法:open(file,mode="r")
完整的語法格式:open(file, mode=r, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
參數說明:
file:必須,文件路徑(相對路徑或者絕對路徑)
mode:可選,文件的打開模式
buffering:緩衝
encoding:編碼格式,一般使用utf8
errors:報錯級別
newline:區別換行符
closefd:傳入的file參數類型
mode常用的有:
r 以只讀的方式打開文件,文件的指針將會放在文件的開頭;這是默認模式。
w 打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
a 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。
r+ 打開一個文件用於讀寫。文件指針將會放在文件的開頭。
w+ 打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
a+ 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。
還有一個b的模式,是二進位模式,或者wb rb ab如果帶有b,說明是和2進位相關。
默認為文本模式,如果要以二進位模式打開,加上 b 。
file對象
file對象使用open函數來創建,下面是file對象常用的函數
1、file.close() 關閉文件,關閉後文件不能再進行讀寫操作。
2、file.flush() 刷新文件內部緩衝,直接把內部緩衝區的數據立刻寫入文件, 而不是被動的等待輸出緩衝區寫入。
3、file.read() 從文件讀取指定的位元組數,如果未給定或為負則讀取所有。
4、file.readline() 讀取整行,包括「 字元」
5、file.readlines() 讀取所有行並返回列表,若給定sizeint>0,返回總和大約為sizeint位元組的行, 實際讀取值可能比 sizeint 較大, 因為需要填充緩衝區。
6、file.seek() 設置文件當前的位置。
7、file.tell()返迴文件的當前位置
8、file.truncate([size]) 從文件的首行首字元開始截斷,截斷文件為 size 個字元,無 size 表示從當前位置截斷;截斷之後後面的所有字元被刪除,其中 Widnows 系統下的換行代表2個字元大小。
9、file.write() 將字元串寫入文件,返回的是寫入的字元長度。
10、file.writelines() 向文件寫入一個序列字元串列表,如果需要換行則要自己加入每行的換行符。
基於字元read 和 write
最基本的對文件的操作就是在文件中讀寫數據:
現在打開一個文件以進行寫操作:
fileHandle = open ( test.txt, w )
『w是指文件將被寫入數據,語句的其它部分很好理解。下一步就是將數據寫入文件:
fileHandle.write ( This is a test file. Really, it is. )
這個語句將「This is a test.」寫入文件的第一行,「Really, it is.」寫入文件的第二行。最後,我們需要做清理工作,並且關閉文件:
fileHandle.close()
正如你所見,在Python的面向對象機制下,這確實非常簡單。需要注意的是,當你再次使用「w」方式在文件中寫數據,所有原來的內容都會被刪除。如果想保留原來的內容,可以使用「a」方式在文件中結尾附加數據:
fileHandle = open ( test.txt, a )
fileHandle.write (
Bottom line. )
然後我們把寫的內容讀出來:
fileHandle = open ( test.txt )
print fileHandle.read()
基於行的讀寫 line:
print fileHandle.readline() # "This is a test."
同時,也可以把內容保存到一個list中:
fileList = fileHandle.readlines()
for fileLine in fileList:
print >>, fileLine
或者在文件中一次讀取幾個位元組的內容:
print fileHandle.read ( 1 )
fileHandle.seek ( 4 )
print FileHandle.read ( 1 )
隨機訪問文件中的位置 seek
Python在讀取一個文件時,會記住其在文件中的位置,如下所示:
garbage = fileHandle.readline()
fileHandle.readline() # "Really, it is."fileHandle.close()
可以看到,只有第二行顯示出來。然而,我們可以讓Python從頭開始讀來解決這個問題:
fileHandle.seek ( 0 )
在上面這個例子中,我們讓Python從文件第一個位元組開始讀取數據。所以,第一行文字顯示了出來。當然,我們也可以獲取Python在文件中的位置:
print fileHandle.tell() # "17"
print fileHandle.readline() # "Really, it is."
二進位方式讀寫
在Windows和Macintosh環境下,有時可能需要以二進位方式讀寫文件,比如圖片和可執行文件。此時,只要在打開文件的方式參數中增加一個「b」即可:
fileHandle = open ( testBinary.txt, wb )
fileHandle.write ( There is no spoon. )
python本身並沒有對二進位進行支持,不過提供了一個模塊來彌補,就是struct模塊。
python沒有二進位類型,但可以存儲二進位類型的數據,就是用string字元串類型來存儲二進位數據,這也沒關係,因為string是以1個位元組為單位的。
import struct
a=12.34
#將a變為二進位
bytes=struct.pack(i,a)
此時bytes就是一個string字元串,字元串按位元組同a的二進位存儲內容相同。
再進行反操作
現有二進位數據bytes,(其實就是字元串),將它反過來轉換成python的數據類型:
a,=struct.unpack(i,bytes)
注意,unpack返回的是tuple
所以如果只有一個變數的話:
那麼,解碼的時候需要這樣
a,=struct.unpack(i,bytes) 或者 (a,)=struct.unpack(i,bytes)
如果直接用a=struct.unpack(i,bytes),那麼 a=(12.34,) ,是一個tuple而不是原來的浮點數了。
如果是由多個數據構成的,可以這樣:
a=hello
b=world!
c=2
d=45.123
bytes=struct.pack(5s6sif,a,b,c,d)
此時的bytes就是二進位形式的數據了,可以直接寫入文件比如 binfile.write(bytes)
然後,當我們需要時可以再讀出來,bytes=binfile.read()
再通過struct.unpack()解碼成python變數
a,b,c,d=struct.unpack(5s6sif,bytes)
5s6sif這個叫做fmt,就是格式化字元串,由數字加字元構成,5s表示佔5個字元的字元串,2i,表示2個整數等等,下面是可用的字元及類型,ctype表示可以與python中的類型一一對應。
小猿圈python入門文件操作就到這裡,有不懂的同學們,可以給小編留言哦,希望跟著python學習的步伐,堅持就是勝利哦,加油~~