讀寫文件前伶棒,我們先必須了解一下旺垒,在磁盤上讀寫文件的功能都是由操作系統(tǒng)提供的,現(xiàn)代操作系統(tǒng)不允許普通的程序直接操作磁盤肤无,所以先蒋,讀寫文件就是請求操作系統(tǒng)打開一個文件對象(通常稱為文件描述符),然后宛渐,通過操作系統(tǒng)提供的接口從這個文件對象中讀取數(shù)據(jù)(讀文件)竞漾,或者把數(shù)據(jù)寫入這個文件對象(寫文件)。
讀文件
要以讀文件的模式打開一個文件對象窥翩,使用Python內(nèi)置的open()函數(shù)业岁,傳入文件名和標示符:
>>> f = open('/Users/michael/test.txt','r')
標示符'r'表示讀,這樣寇蚊,我們就成功地打開了一個文件笔时。
如果文件不存在,open()函數(shù)就會拋出一個IOError的錯誤仗岸,并且給出錯誤碼和詳細的信息告訴你文件不存在:
>>> f=open('/Users/michael/notfound.txt', 'r')
Traceback (most recentcalllast):?
? ? ?File"", line1,in
FileNotFoundError: [Errno2]Nosuch fileordirectory:'/Users/michael/notfound.txt'
如果文件打開成功允耿,接下來,調(diào)用read()方法可以一次讀取文件的全部內(nèi)容扒怖,Python把內(nèi)容讀到內(nèi)存较锡,用一個str對象表示:
>>> f.read()'Hello, world!'
最后一步是調(diào)用close()方法關閉文件。文件使用完畢后必須關閉姚垃,因為文件對象會占用操作系統(tǒng)的資源念链,并且操作系統(tǒng)同一時間能打開的文件數(shù)量也是有限的:
>>> f.close()
由于文件讀寫時都有可能產(chǎn)生IOError,一旦出錯,后面的f.close()就不會調(diào)用掂墓。所以谦纱,為了保證無論是否出錯都能正確地關閉文件,我們可以使用try ... finally來實現(xiàn):
try:? ??
????f = open('/path/to/file','r')? ??
????print(f.read())
finally:
????if f:? ? ? ??
????????f.close()
但是每次都這么寫實在太繁瑣君编,所以跨嘉,Python引入了with語句來自動幫我們調(diào)用close()方法:
with open('/path/to/file','r') as f:? ??
????print(f.read())
這和前面的try ... finally是一樣的,但是代碼更佳簡潔吃嘿,并且不必調(diào)用f.close()方法祠乃。
調(diào)用read()會一次性讀取文件的全部內(nèi)容,如果文件有10G兑燥,內(nèi)存就爆了亮瓷,所以,要保險起見降瞳,可以反復調(diào)用read(size)方法嘱支,每次最多讀取size個字節(jié)的內(nèi)容。另外挣饥,調(diào)用readline()可以每次讀取一行內(nèi)容除师,調(diào)用readlines()一次讀取所有內(nèi)容并按行返回list。因此扔枫,要根據(jù)需要決定怎么調(diào)用汛聚。
如果文件很小,read()一次性讀取最方便短荐;如果不能確定文件大小倚舀,反復調(diào)用read(size)比較保險;如果是配置文件搓侄,調(diào)用readlines()最方便:
for line in f.readlines():? ??
????print(line.strip())# 把末尾的'\n'刪掉