操作系統一般不允許程序直接操作磁盤文件的,文件在磁盤上的讀寫都是由操作系統提供的,文件操作包括創建、删除、修改權限、讀取、寫入等。要想實現對文件的操作就需要請求操作系統打開一個文件對象,然後通過操作系統提供的接口來實現對文件讀寫的相關操作。讀寫文件是最常見的 I/O 操作,Python内置相關API可以幫助我們快速的實現文件讀寫操作。
Python内置的 open() 函數可以用于打開指定文件 ,該函數會返回一個文件對象(該對象包含了當前文件擁有的屬性信息,相當于文件句柄)。參數file為要創建或打開文件的文件名稱,參數mode用于指定文件的打開模式(可選),參數buffering用于指定對文件做讀寫操作時是否使用緩沖區。在打開文件之後就可調用文件對象的屬性和方法,完成對文件的讀/寫操作之後最後需要關閉該文件,通過文件對象的close() 函數來實現即可。
文件打開是可以指定其打開的模式,該參數通過mode來指定【默認模式為隻讀(r)】。選擇不同的打開模式決定了後續可以對文件進行操作,如果使用 r 模式打開的文件則隻能讀取文件而無法修改文件内容。open()提供了多種打開模式,下面列出了對應的打開模式和說明:
緩存是數據交換的緩沖區,打開緩沖後當程序執行輸出時會先将數據輸出到緩沖區中,當要讀取數據時會首先從緩存中查找需要的數據,如果找到了就直接執行沒有再去内存中找。緩存的運行速度比内存快得多,可以幫助硬件更快地運行程序。所以使用open'的時候建議打開緩沖,這樣程序執行 I/O 操作時将具有更好的性能。緩沖通過參數buffing來定義, 0代表不緩沖,1或大于1使用的緩沖區字節數大小,1表示使用系統默認緩沖字節數1024。
一般情況下文件關閉後會自動刷新到硬盤中并刷新緩沖區,如果你想在文件操作過程中更新緩沖時可以使用 flush()函數。該函數可以将緩沖強制刷新到硬盤中并清空緩沖區,當操作的文件較大時可以使用該函數及時的更新緩沖區。
文件打開之後我們就可以獲得該文件對象,該對象中包含了文件的一些屬性。
文件對象中提供了很多API可以用來讀取文件内容,讀取文件内容可使用 read()、readline() 以及 readlines() 函數。 read()會讀出全部内容,readline()會逐行讀取内容。readlines()則将指定的行數内容讀取出來并返回一個列表,如果沒有指定行數則全部輸出。
要實現内容的寫入我們在打開文件時就需要先指定文件對象為可寫模式,通過參數mode指定文件打開模式為讀寫(r )。文件對象中同樣提供了很多API可以用來寫入文件内容,向文件中寫入内容可以使用 write() 函數和writelines() 函數。write() 函數和read()、readline()函數對應可以将字符串寫入文件(多個字符串寫入會自動追到),writelines() 函數則與readlines()函數對應用來寫入字符串列表的。readlines寫入列表數據時不會自動換行,如果希望根據列表元素換行則需要在列表中顯式的加入換行符。
文件對象提供了一個tell()函數用來定位當前文件位置(這個定位的是字節位,計算機的最小存在單位),下次繼續寫入的時候就會知道從哪裡開始繼續。如果想改變當前文件的位置我們可以通過函數seek(offset [,from])來指定偏移量,offset 表示要移動的字節數(默認從起始位置),from指定開始移動字節的參考位置(可選)。from設置為0則以文件起始位置開始,當為1則從當前位置開始,當為2時從文件末尾開始編譯offset個字節量。
在使用seek()函數時你可能會遇到這樣的錯誤提示:“io.UnsupportedOperation: can't do nonzero cur-relative seeks”,這是因為沒有指定b模式選項打開文件。r隻允許從文件頭開始計算相對位置,從文件其他位置計算時就會引發異常。這時候如果是寫入就需要注意參數類型了,請求參數變成bytes對象了而不是str。
文件操作完之後應該及時的關閉,因為文件打開之後會産生緩存占用系統資源。而且如果文件被占用也容易造成其他程序執行異常,所以當我們操作完成之後應該及時關閉。關閉已經打開的文件可以使用close()函數來實現,關閉後的文件不能再進行讀寫操作(需要重新打開)。為了方便關閉文件Python增加了with功能,當with體執行完将自動執行close()函數來關閉打開的文件。
Python操作文件還是相當的簡單高效的,利用open() 函數就可以快速的打開一個文件并創建文件流對象,這時候我們就可以調用它提供的方法進行讀寫操作。with可以創建一個臨時的運行環境,運行環境中的代碼執行完後自動安全退出環境。這樣就可以不用close()方法關閉文件,無論在文件使用中遇到什麼問題都能安全的退出并給出報錯信息。以上内容是小編給大家分享的【Python實戰012:open打開指定文件及常見操作指南】。希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回複大家的。
為了方便學習,下面附上本文用到的源碼:
with open(filepath,mode='r',encoding='utf-8') as rf:
rf.read() //讀取整個文件對象
rf.readline() //讀取每一行
rf.readlines() //讀取指定行内容,未指定則返回全部
rf.readable() //檢查文件是否可讀
with open('./a.txt', 'r ', encoding='utf-8', buffering=1024) as wf:
str = "測試數據\n"
str_list= ['1\n','2\n','3\n','4']
wf.write(str)
wf.writelines(str_list)
with open('./a.txt', 'rb ', buffering=1024) as wf:
str1 = "件對象提供了一個tell()函數用來定位當前文件位置"
wf.write(str1) # 錯誤 :TypeError: a bytes-like object is required, not 'str'
wf.write(str1.encode())
wf.seek(6, 0) #從起始位置開始偏移6個字節
wf.write('000'.encode())
wf.seek(9, 1) # 從當前位置開始偏移9個字節
wf.write('111'.encode())
wf.seek(6, 2) # 從末尾位置開始偏移6個字節
wf.write('222'.encode())
with open('./a.txt',mode='r') as rf:
rf.read()
------------------ 等效 ----------------------
rf=open('./a.txt',mode='r')
rf.read()
rf.close()
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!