Python_檔案操作
Python檔案操作常用方法
1.開啟檔案
語法如下:
file_object = open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
➢ file:檔名稱。 ➢mode:制定了檔案開啟的方式,函式提供瞭如下方式,其中,'rt'為預設 方式。 ➢buffering:如果buffering的值被設定為0,就不會有快取;如果值為1, 訪問檔案時會快取行;如果值位大於1的整數,表明了這就是寄存區的緩衝 大小;如果取負值,寄存區的緩衝大小則為系統預設。該引數也是非強制性 的。 ➢encoding:編碼或者解碼方式。預設編碼方式依賴平臺,如果需要特殊設定,可以參考codecs模組,獲取編碼列表。 ➢errors:可選,並且不能用於二進位制模式,指定了編碼錯誤的處理方式, 可以通過codecs.Codec獲得編碼錯誤字串 ➢newline:換行控制,引數有:None,'\n','\r','\r\n'。 輸入時,如果引數為None,那麼行結束的標誌可以是:'\n','\r','\r\n'任 意一個,並且三個控制符都首先會被轉化為:'\n',然後才會被呼叫; 如果引數為'',所有的通用的換行結束標誌都可以用,但是行結束識別符號返 回撥用不會被編碼。輸出時,如果引數為None,那麼行結束的標誌可以是: '\n'被轉換為系統預設的分隔符;如果是'','\n'則不會被編碼。 ➢closefd:false:檔案關閉時,底層檔案描述符仍然為開啟狀態,這是不 被允許的,所以,需要設定為ture ➢opener:可以通過呼叫*opener*方式,使用自定義的開啟器。底層檔案 描述符是通過呼叫*opener*或者*file*, *flags*獲得的。 ➢*opener*必須返回一個開啟的檔案描述。將os.open作為*opener*的結 果,在功能上,類似於通過None。
例項1:
fp = open("e:\\pyScripts\\testfile.txt","r") print(type(fp)) fp.close()
例項2:
with方式開啟檔案:會預設關閉檔案
with open("e:\\pyScripts\\sample2.txt","r",encoding="utf-8") as fp: for line in fp: print(line)
檔案的操作模式
模式 | 描述 |
r | 以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式 |
rb | 以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。這是預設模式 |
r+ | 開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭 |
rb+ | 以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。 |
w | 開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案 |
wb | 以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
w+ | 開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
wb+ | 以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新 檔案 |
a | 開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容 將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。 |
ab | 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是 說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入 |
a+ | 開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加 模式。如果該檔案不存在,建立新檔案用於讀寫 |
ab+ | 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該 檔案不存在,建立新檔案用於讀寫 |
2.讀檔案
fileObject.read([size])
size為讀取的長度,以byte為單位。如果不指定引數,表示一次性讀取全部內容,以字串形式返回,並且每一行結尾會有一個"\n"符號。
>>> fp = open("e:\\pyScripts\\sample2.txt") >>> fp.tell() 0 >>> fp.read() 'test1\ntest2\n\ntest3\n' >>> fp.tell() 23 >>> fp.close() >>> fp = open("e:\\pyScripts\\sample2.txt") >>> fp.read(8) 'test1\nte' >>> fp.tell() 9 >>> fp.close()
fileObject.readline([size])
讀取當前行的內容,以字串的形式返回,並且結尾有換行符'\n'。讀完一行,檔案操作標記移動到下一行的 開頭。指定引數,若引數<=當前行的位元組數,返回該引數指定的位元組數。若引數>當前行的位元組數,返回當前行的內容。讀完所有行再執行該函式,返回空字串
>>> fp = open("e:\\pyScripts\\sample2.txt") >>> fp.readline() 'test1\n' >>> fp.tell() 7 >>> fp.readline() 'test2\n' >>> fp.readline() '' >>> fp.close()
>>> fp = open("e:\\pyScripts\\sample2.txt") >>> fp.readline(4) 'test' >>> fp.seek(0,0) 0 >>> fp.readline(7) 'test1\n' >>> fp.seek(0,0) 0 >>> fp.readline(10) 'test1\n' >>> fp.close()
fileObject.readlines( [size] )
把檔案每一行作為一個list的一個成員,型別是一個字串,並且結尾會有 一個換行符"\n",並返回這個list。這個函式的內部是通過迴圈呼叫 readline()來實現的。
>>> fp = open("e:\\pyScripts\\sample2.txt") >>> fp.readlines() ['test1\n', 'test2\n', '\n', 'test3\n'] >>> fp.seek(0,0) 0 >>> fp.readlines(5) ['test1\n'] >>> fp.seek(0,0) 0 >>> fp.readlines(8) ['test1\n', 'test2\n'] >>> fp.seek(0,0)
3.寫檔案
fileObject.write( str )
將str寫入檔案中,如需換行的話,手動加換行符'\n'
with open("e:\\pyScripts\\sample2.txt","w") as fp: fp.write('test10201\ntest10202')
fileObject.writelines(seq)
把seq(序列)的內容全部寫到檔案中(多行一次性寫入),也不會自動加入換行符。
序列中的元素必須是字串
with open("e:\\pyScripts\\sample2.txt","w") as fp: testList = ['test01\n','test02\n','test03\n'] fp.writelines(testList)
4.其他常用操作
fileObject.tell()-----返回檔案操作的當前位置
test02.py
fp = open("e:\\pyScripts\\sample2.txt","r") print("初始化檔案讀取的當前位置:",fp.tell()) print("讀取檔案的行內容:",fp.readline()) print("讀取該行後文件操作的當前位置:",fp.tell()) fp.close()
執行結果:
初始化檔案讀取的當前位置: 0 讀取檔案的行內容: test01 讀取該行後文件操作的當前位置: 8
fileObject.seek( offset[, from ] )---該方法是改變當前檔案的位置
offset變量表示要移動的位元組數。 from變數指定開始移動位元組的參考位置。0--代表從檔案的開頭移動,1--代表從檔案的當前位置移動,2--代表從檔案的末尾移動 注意:如果檔案以a或a+的模式開啟,每次進行寫操作時,檔案操作標記會自動返回到檔案末尾。
test02.py
fp = open("e:\\pyScripts\\sample2.txt","r") print("初始化檔案讀取的當前位置:",fp.tell()) print("讀取檔案的行內容:",fp.readline()) print("讀取該行後文件操作的當前位置:",fp.tell()) fp.seek(0,0) print("fp.seek(0,0)後回到檔案的初始位置:",fp.tell()) fp.close()
執行結果:
初始化檔案讀取的當前位置: 0 讀取檔案的行內容: test01 讀取該行後文件操作的當前位置: 8 fp.seek(0,0)回到檔案的初始位置: 0
fileObject.truncate( [size] )---把檔案裁剪成規定的大小,預設的是裁到當前檔案操作標記的位置。
>>> fp=open("e:\\pyScripts\\sample1.txt","r+") >>> fp.truncate(2) 2 >>> fp.seek(0,0) 0 >>> fp.read() 'te' >>> fp.close()
fileObject.flush()---將緩衝區的內容寫入磁碟
>>> fp=open("e:\\pyScripts\\sample2.txt","w+") >>> fp.writelines(testList) >>> fp.flush() >>> fp1=open("e:\\pyScripts\\sample2.txt","r") >>> fp1.read() 'test01\ntest02\ntest03\n' >>> fp.close() >>> fp1.close()
fileObject.fileno()---返回一個長整型的檔案標籤
>>> fp=open("e:\\pyScripts\\sample1.txt","r") >>> fp.fileno() 3 >>> fp1=open("e:\\pyScripts\\sample2.txt","r") >>> fp1.fileno() 4 >>> fp.close() >>> fp1.close()
5.檔案的常見屬性
fp = open("e:\\pyScripts\\sample2.txt") print("檔案是否關閉:",fp.closed) print("檔案的訪問模式:",fp.mode) print("檔名稱:",fp.name) fp.close()
6.小練習
刪除檔案中的空行
解法1: fp=open("e:\\pyScripts\\sample1.txt","r") lst=fp.readlines() result=[] for i in lst: if i !="\n": result.append(i) fp.close() fp=open("e:\\pyScripts\\sample2.txt","w+") fp.writelines(result) fp.close()
解法2:
fp=open("e:\\a.txt","r+") lines= fp.readlines() fp.seek(0,0) for line in lines: if line.strip(): fp.write(line)
fp.close()