1. 程式人生 > >Python_檔案操作

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()