Python的文件對象不僅包括實際的磁盤文件,也可以是其他的存儲和通信設備,如鍵盤等。
文件打開和關閉
open(file, mode , buffering, encoding, errors, newline, closefd, opener)
file = 'test.txt'
f = open(file,'w+',encoding = 'utf-8')
f.close # 打開的文件最後需要關閉
with open(file,'w+',encoding = 'utf-8') as f
f.write('文本內容')
# 使用 with as 時可以自動關閉
file 參數
file參數數據格式可以是字符串和整數,文件名可以是相對當前目錄的路徑,也可以是絕對路徑表示;如果file是整數表示文件描述符,文件描述符指向一個已經打開的文件。
mode參數
mode設置文件打開模式,文件打開模式用字符串表示,最基本的文件打開模式如下表所示。
字符串 | 說明 |
---|---|
r | 只讀模式(默認) |
w | 寫入模式,覆蓋當前文件 |
x | 獨佔創建模式,如果文件不存在則創建並寫入模式打開,存在則拋出異常 |
a | 追加模式,寫入內容不覆蓋 |
b | 二進制模式 |
t | 文本模式(默認) |
+ | 更新模式 |
b和t是文件類型模式,如果是二進制文件需要設置rb、wb、xb、ab;如果文本文件需要設置rt、wt、xt、at,由於t是默認模式,所以可以省略爲r、w、x、a。
+必須與r、w、x或a組合使用,設置文件爲讀寫模式,對於文本文件可以使用r+、w+、x+或a+;對於二進制文件可以使用rb+、wb+、xb+或ab+。
注意 r+、w+和a+區別。r+打開文件時如果文件不存在則拋出異常;w+打開文件時如果文件不存在則創建文件,文件存在則清除文件內容;a+類似於w+,打開文件時如果文件不存在則創建文件,文件存在則在文件末尾追加。
buffering參數
buffering是設置緩衝區策略,默認值爲-1,當buffering=-1時系統會自動設置緩衝區,通常是4096或8192字節;當buffering=0時是關閉緩衝區,關閉緩衝區時數據直接寫入到文件中,這種模式主要應用於二進制文件寫入操作;當buffering>0時,buffering是設置緩衝區字節大小
encoding和errors參數
encoding用來指定打開文件時的文件編碼,主要用於文本文件打開。errors參數用來指定當編碼發生錯誤時如何處理。
newline參數
newline設置換行模式。
closefd和opener參數
這兩個參數是在file參數爲文件描述符時使用。closefd爲True時,文件對象調用close()方法關閉文件同時也會關閉文件描述符所對應的文件;closefd爲False時,文件對象調用close()方法關閉文件,但不會關閉文件描述符所對應的文件。
opener參數用於打開文件時執行一些加工操作,opener參數執行一個函數,該函數返回一個文件描述符。
文件讀寫
文本文件讀寫的單位是字符,而且字符是有編碼的,二進制文件讀寫的單位是字節,不需要考慮編碼的問題。讀寫主要方法如下:
函數名 | 說明 |
---|---|
read(size=-1) | 從文件中讀取字符串,size限制讀取最多字符數,size=-1沒有限制讀取全部內容。 |
readline(size=-1) | 讀取到換行符或文件尾並返回單行字符串。如果已經到文件尾,則返回一個空字符串。size是限制讀取的字符數,size=-1沒有限制。 |
readlines(hint=-1) | 讀取文件數據到一個字符串列表中,每一個行數據是列表的一個元素。hint是限制讀取的行數,hint=-1沒有限制。 |
write(s) | 將字符串s寫入文件,並返回寫入的字符數。 |
writelines(lines) | 向文件中寫入一個列表。不添加行分隔符,因此通常爲每一行末尾提供行分隔符。 |
flush() | 刷新寫緩衝區,數據會寫入到文件中。 |
file = 'test.txt'
with open(file,'r+',encoding = 'utf-8') as f:
content = f.read()
print(content)
print(type(content))
print(f.tell()) # 獲得當前光標位置
f.seek(0) # 設置當前光標位置
content = f.readline() # 只讀一行
print(content)
print(type(content))
f.seek(0)
content = f.readlines() # 全部讀出來,用列表裝
print(content)
print(type(content))
read() 全部讀取,返回str,readline()只讀一行,返回str,readlines全讀,返回list。