python中對于檔案有讀和寫操作。
打開檔案
# 現建立一個hello.txt檔案,然後加入内容hello world
f = open(file='./hello.txt')
result = f.read()
print(result ) #輸出: hello world
f.close()
- 打開檔案會用到open()函數,文法為:open(name[,mode[,buffering]]);
- open函數()的檔案名是必須的,而模式和緩沖參數都是可選的;
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
- buffering :是指緩沖大小,-1表示預設大小4096,0表示關閉緩沖區, encoding表示編碼方式,None表示預設的編碼方式;
- errors :表示編碼錯誤被捕獲,如果是errors=ignore,那麼出現編碼錯誤将會被忽略;
- newline :表示檔案換行的意思;
- closefd :表示是否關閉檔案時同時關閉檔案描述符;
mode模式參數常用值
-
:隻讀;'r'
-
:隻寫,從開頭開始寫,是以會覆寫檔案的内容;'w'
-
:追加,不會覆寫檔案内容;'a'
-
:隻寫,如果檔案不存在則建立檔案,以隻寫方式打開檔案,保護寫;'x'
-
:二進制;'b'
-
:文本,是預設的模式,可以不寫,一般都是以文本模式打開檔案;'t'
-
:讀寫;'+'
-
:給隻讀賦予寫的能力;'r+'
-
:給隻寫賦予隻讀的能力,因為是以隻寫的形式打開檔案,會清空檔案内容,是以不能讀取到内容,隻是有了讀的功能;'w+'
檔案讀取
f = open(file='./hello.txt',mode='w')
result = f.read()
print(result) # hello world
f.write('a') # 如果寫入則會報錯,因為此時是隻讀模式
#
result1 = f.read(3) # 表示檔案讀三個位元組,不給值表示直接讀到EOF
print(result1) # hel
f.close() # 讀取完檔案一定要關閉
- 讀取檔案會用到read()函數,用于從檔案中讀取指定的字元數,如果未給定或為負值則表示讀取所有字元;
- 如果檔案非常大,尤其是大于記憶體時,無法使用read()方法;
檔案寫入
-
,w
,x
都是隻寫,a
模式是字元流,按照字元編碼了解,t
是位元組流,位元組操作是bytes類型;b
-
無法單獨使用,用來增強+
,r
,w
,x
等功能,但是在擷取檔案對象是依然是本身的特性;a
# w為隻寫模式
f = open(file='./hello.txt', mode='w')
f.write('a')
f.read() # 此時讀就會報錯
f.close()
# x是隻寫,檔案不存在,建立檔案,以隻寫方式打開
f = open('./test.txt', 'x')
# f.read() # 此時讀會報錯
f.write('a')
f.close()
# a隻寫,檔案存在,追加内容,檔案不存在,隻寫,追加内容
f = open('./test1.txt', 'a')
# f.read() # 此時讀會報錯
f.write('aaa')
f.close()
檔案指針
f = open('hello.txt', 'r+')
print(f.tell()) # 檔案的起始位置 0
print(f.read()) # 讀檔案所有的内容
print(f.tell()) # EOF,也就是最後一個字元是幾
print(f.seek(3)) # 偏移兩個位元組
print(f.read())
f.close()
f = open('test.txt', 'rb+')
print(f.tell()) # 檔案的起始位置0
print(f.read()) # 讀檔案所有的内容
print(f.tell()) # EOF,也就是最後一個字元
print(f.seek(2)) # 偏移兩個位元組
print(f.read())
f.write(b'ni hao')
f.seek(2,2) # 二級制模式下,seek(offset, whence=0) 可以給whence傳遞1, 2 或 0, 0表示檔案從頭開始, 1表示從目前位置開始,2表示從檔案末尾EOF開始
f.seek(1,1)
f.write(b'ni hao')
f.flush() # 将緩存重新整理到檔案
f.write(b'ni hao')
f.close() # 檔案句柄關閉的時候,會将緩存重新整理到檔案
- mode為
的時候,指針的起始點在0;r
- mode為
的時候,指針的起始點在EOF,檔案末尾;a
- tell()函數 :顯示指針的目前位置;
- seek()函數 :移動檔案指針的位置,參數offset指的是偏移的位元組;
- flush()函數 :将緩存重新整理到檔案;
- close()函數 :關閉檔案;
檔案行讀取
import io
f = open('hello.txt', 'r+')
print(io.DEFAULT_BUFFER_SIZE) # 8192
print(f.readline(), '第一行') # 讀取一行
print(f.readline(), '第二行')
print(f.readlines()) # 讀取所有行,且傳回清單
- readline() 函數 用于從檔案讀取整行(包括 "n" 字元),如果指定了一個非負數的參數,則傳回指定大小的位元組數(包括 "n" 字元);
- readlines() 函數 用于讀取所有行,且傳回值為清單形式;
檔案上下文管理器
使用with 關鍵字可以實作上下文管理器,通過上下文管理的方式打開檔案,在檔案末尾會自動執行關閉語句,不需要寫f.close()來關閉檔案了。
示例:with open('test.txt',mode='w') as f:
f.write('加油!')