作業系統一般不允許程式直接操作磁碟檔案的,檔案在磁碟上的讀寫都是由作業系統提供的,檔案操作包括建立、刪除、修改許可權、讀取、寫入等。要想實現對檔案的操作就需要請求作業系統開啟一個檔案物件,然後透過作業系統提供的介面來實現對檔案讀寫的相關操作。讀寫檔案是最常見的 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個位元組量。
錯誤解決:can't do nonzero cur-relative seeks在使用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()