第三篇:python3的檔案讀寫操作
簡介
檔案的讀寫操作幾乎是每門語言都有的基礎。python的檔案操作過程可以分成以下三步:
- 用
open()
函式開啟一個檔案(沒有則新建),獲得檔案操作符 - 通過檔案控制代碼對檔案進行操作
- 完成檔案操作,用
close()
函式關閉檔案控制代碼
下面就按這三步來,簡單總結一下。
open()開啟一個檔案
在對檔案進行操作時,我們首先是使用open()
函式來開啟一個檔案,從而獲得它的檔案操作符(也有稱檔案控制代碼),不論是讀操作還是寫操作,都是使用open()
。
那麼,怎麼使用open()
呢?
我們來看看open()
的幾個關鍵的引數.
open(‘test.txt’,’mode’,encoding=’xxx’)
上式中,第一個引數是檔案的路徑名;第三個引數的xxx那裡是填入適當的編碼格式,加入你的檔案是gbk格式的,你開啟的時候,為了防止出現亂碼,你就得告訴函式,需要用什麼格式開啟。
至於第二個引數mode,有許多個值可以填的,可以根據需求填值:
mode | 說明 |
---|---|
r | 以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。 |
rb | 以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。這是預設模式。 |
r+ | 開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。 |
rb+ | 以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。 |
w | 開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
wb | 以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
w+ | 開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
wb+ | 以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
a | 開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。 |
ab | 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。 |
a+ | 開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。 |
ab+ | 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。 |
檔案操作
我們通過open()函式獲得檔案操作符後就可以對檔案進行讀操作(mode=’r’),或者寫操作了(mode=’w’)
讀操作
#!/usr/bin/env python3
f = open('fileTest.txt', 'r')
f = f.read()
print(f)
read()
一次性讀取檔案的全部內容,可以在read(size)
裡面傳參,表示每次讀取size個位元組的內容。
readline()
每次讀取檔案一行的內容。
readlines()
一次讀取所有內容並按行返回 list。
寫操作
只有呼叫close()
方法時,作業系統才能保證把沒有寫入的資料全部寫入磁碟:
#!/usr/bin/env python3
# _*_coding:UTF-8_*_
# 寫操作
f = open('fileTest2.txt','w')
f.write('hello! It`s me!')
f.close()
對於要寫入特定編碼的文字檔案,可以給open()
的encoding傳參:
#!/usr/bin/env python3
# _*_coding:UTF-8_*_
# 寫操作
f = open('fileTest2.txt','w',encoding='gbk')
f.write('hello! It`s me!')
f.close()
write()
是檔案寫操作中一個比較簡單的操作,它將字串寫入檔案,沒有返回值。除了這個write()
還有writelines()
函式,這個函式是向檔案寫入一個序列字串列表,換行需要位元組新增換行符:
#!/usr/bin/env python3
# _*_coding:UTF-8_*_
# writelines()
str = ['你好,','歡迎!\n','這裡是ZER021的部落格.']
f = open('fileTest2.txt','w',encoding='utf-8')
f.writelines(str)
f.close()
'''
這是執行結果:
你好,歡迎!
這裡是ZER021的部落格.
'''
檔案其他操作函式
seek()
:指定檔案指標的位置,seek(0)把指標移動到檔案開頭處;
tell()
:獲取檔案指標的位置;
#!/usr/bin/env python3
# _*_coding:UTF-8_*_
f = open('fileTest.txt','r',encoding='utf-8')
#讀取一行
data = f.readline()
# 檢視指標位置
print(data.strip())
print('輸出一行後的檔案指標在:',f.tell())
f.seek(0)
print('用seek()將檔案指標放回開始處:',f.tell())
print('再次輸出:',f.readline())
f.close()
這是執行結果:
truncate()
:截斷檔案資料,返回保留指定之前的資料,不能用w
和w+
模式開啟;
with open('fileTest2.txt','r+',encoding='utf-8') as f:
# 截斷5個字元後,讀取檔案
f.truncate(5)
print('呼叫truncate(5)之後的輸出:', f.read())
flush()
:重新整理檔案內部緩衝區,下面是利用flush()重新整理可以建立一個單行顯示動態的進度條。
#!/usr/bin/env python3
# _*_coding:UTF-8_*_
import sys,time
for i in range(50):
sys.stdout.write("#")
sys.stdout.flush()
time.sleep(0.1)
fileno()
:獲取檔案描述符
f = open('fileTest.txt','r',encoding='utf-8')
print(f.fileno())
isatty()
:測試是否是一個終端裝置檔案
next()
返回檔案下一行;以下是返回10行的程式碼:
f = open('fileTest.txt','r',encoding='utf-8')
for i in range(10):
print(f.__next__().strip())
f.close()
encoding()
:顯示檔案編碼:
f = open('fileTest.txt','r',encoding='utf-8')
print(f.encoding)
replace()
可用於檔案的修改:
f = open('fileTest.txt','r',encoding='utf-8')
for i in f.readlines():
if '凌霄花' in i:
i = i.replace('凌霄花','很多很多凌霄花')
print(i.strip())
f.close()
執行結果:
關閉檔案操作
我們結束檔案操作後,需要呼叫close()
為關閉檔案操作符,以免佔有記憶體資源。當然,python為我們提供了更便捷的語句,幫助我們關閉,那就with
。上面的程式碼,修改成下面這個也是行得通的,而且也不用在寫close()
函式:
with open('fileTest.txt','r',encoding='utf-8') as f:
for i in f.readlines():
if '凌霄花' in i:
i = i.replace('凌霄花','很多很多凌霄花')
print(i.strip())