一、讀寫文件方式
在當前python文件同級目錄下存在一個名為file的文件,內容如下
1、使用with open讀取文件
def read_file(filepath): with open(filepath) as fp: content=fp.read(); return content ret=read_file('file') print(ret)
在上述腳本中可以發現,content作為一個列表,雖然在with open結構體內,但在with open結構體外也可以使用,但在方法內部定義的變量,在方法外部一般是不能訪問的,這在java中被稱為局部變量。
2、不使用with讀取文件
def read_file(filepath): fp=open(filepath) content=fp.readlines() fp.close() return content ret=read_file('file') print(ret)
通過對兩種讀取方式的對比發現,第一種方式比較簡潔,不用關心流是否關閉,with會在文件不再使用時自動關閉流,並且輸出的格式與文件內容中顯示的一致。第二種方式就必須要手動顯示的關閉流,且輸出格式與文件內容不同,需要進行特殊處理,且發生異常之后,可能會導致流未正常關閉。
對第二種方式輸出結果做處理,使其與文件內容一致,。readlines方法返回的為一個列表,故需要對類表進行遍歷,替換特殊符號
def read_file(filepath): str="" fp=open(filepath) content=fp.readlines() for c in content: str+=c.replace('\n','\n') fp.close() return str ret=read_file('file') print(ret)
實際使用中,建議使用第一種方式來讀寫文件內容,當文件不在當前python文件同級目錄時,可使用絕對路徑后者相對路徑來確定文件的位置
二、文件打開方式
open方法可以傳遞兩個參數,第一個參數為文件路徑,第二個參數為打開文件的方式,可選值為r/w/a/r+
r 只讀模式打開文件,如果為傳遞第二個參數,則默認為r
w 寫入模式打開文件
a 附加模式打開文件
r+ 讀取和寫入模式打開文件
1、只讀模式(如上述實例),如果文件不存在,則拋出No such file or directory的異常
2、寫入模式
如果寫入的文件不存在,則會新建該文件,並且寫入內容,如果文件已存在,則會覆蓋文件之前內容,所以使用該方式時需要慎重,確定文件中之前內容被覆蓋是否影響當前業務邏輯。
def w_file(filepath): with open(filepath,'w') as wf: wf.write('today is a nice day\n') wf.write('do you want to take a trip.') w_file('wfile.txt')
寫入模式只能寫入,不能讀取,若果在wf.write下面添加如下腳本,則會出現io.UnsupportedOperation: not readable的異常
content=wf.read() print(content)
3、附加模式
def a_file(filepath): with open(filepath,'a') as af: af.write('nice day\n') af.write('good start.') a_file('file')
4、讀寫模式
def rw_file(filepath): with open(filepath,'r+') as rwf: rwf.write('This is myfile.\n') rwf.write("The end.") content=rwf.read() return content content=rw_file('myfile') print(content)
與讀取模式相同,若文件不存在,也將拋出異常
在當前Python腳本所在同級目錄新建文件myfile,重新執行
通過上述控制台輸出及文件內容來看,控制台並未輸出任何內容,但要寫入的信息已經保存到文件中,這說明,在執行read時,信息還未被寫入文件。
如果該文件內容已存在,執行上述讀寫程序,是否能夠讀取到文件內容,來嘗試一下,保留上次myfile中內容,程序中向文件添加一行記錄,再次讀取之前文件內容
def rw_file(filepath): with open(filepath,'r+') as rwf: rwf.write("new append") content=rwf.read() return content content=rw_file('myfile') print(content)
可以看到,讀取的內容與原有文件內容不同,缺少了This is my字符,而文件中新添加的new append剛好填充了缺少的字符所在位置。
上述示例先寫入,再讀取,出現上述情況也是意料之中,那么如果先讀取之前文件,在寫入,是否就和預期一樣,讀取原有文件內容,並且添加新內容?
現在文件myfile內容如下
def rw_file(filepath): with open(filepath,'r+') as rwf: content=rwf.read() rwf.write('\nappend new line.\n') rwf.write("new end.\n") return content content=rw_file('myfile') print(content)
如上所示,答案是肯定的,先讀取出了原有內容,在原有內容基礎上添加了新內容。所以我們在使用的時候要注意讀取和寫入的順序。