什么是檔案
檔案是系統存盤區域的一個命名位置,用來存盤一些資訊,便于后續訪問,能夠在非易失性存盤器中實作持續性存盤,比如在硬碟上,當我們要讀取或者寫入檔案時,我們需要打開檔案;在操作完畢時,我們需要關閉檔案,以便釋放和檔案操作相關的系統資源,因此,檔案操作的主要包括以下:
打開檔案
- 讀取或者寫入
- 關閉檔案
- 打開檔案
Python使用內置的open()函式打開一個檔案,并且回傳一個檔案物件,也叫句柄(handle),
f = open("test.txt") # 在本檔案夾下面的一個檔案
f = open("C:/Python33/README.txt") # 全路徑
再打開檔案時,我們需要指定檔案打開的模式,當我們需要讀取檔案時,使用f = open("test.txt", 'r'),寫入檔案時,使用f = open("test.txt", 'w'),追加輸入時f = open("test.txt", 'a'),這里的a就是append的意思,追加模式和寫入模式的區別就是,寫入模式打開一個檔案時,無論這個檔案是否有內容,都會被清空再寫入;在使用追加模式時,打開的檔案,只是在原有的內容上繼續進行寫入,同時我們也要制定以文本模式打開還是二進制模式打開,
文本模式(text mode)和二進制(binary mode)模式的區別
文本模式中,讀取時作業系統的換行符('\n' on Unix,'\r\n' on Windows)會被轉換成Python的默認換行符\n,寫入時會將默認的換行符轉換為作業系統的換行符;在二進制模式中不會轉換,這個轉化在對文本檔案沒有影響,但是對于二進制資料會有影響,比如影像檔案或者EXE檔案等,因此, 再打開這類檔案時,一般使用二進制模式進行讀寫
常用模式
| r | 文本模式,讀取 | |
| rb | 二進制模式,讀取 | |
| w | 文本模式,寫入 | |
| wb | 二進制模式,寫入 | |
| a | 文本模式,追加 | |
| ab | 二進制模式,追加 | |
| + | 可讀可寫 |
f = open("test.txt", 'r') # 讀模式
f = open("test.txt", 'w') # 寫模式
f = open("img.bmp",'r+') # 可讀可寫
f = open("img.bmp",'w+') # 可讀可寫
f = open("img.bmp",'rb') # 二進制讀取
如何關閉檔案
當檔案操作結束時,我們最好主動關閉檔案,盡管Python有垃圾回收(garbage collector)機制,去清理不用的物件,但是最好還是自己關閉檔案,
最簡單的方法就是:
f = open("app.log", 'r')
do_something()
f.close()
但是這個辦法不安全,因為在進行其他操作時,可能會出現例外,程式退出,那么關閉檔案的陳述句就不會被執行,
因此,可以用
try:
f = open('app.log', 'r')
do_something()
finally:
f.close()
無論是否發生例外,關閉檔案的指令都會被執行,
但是python官方給出的最佳用法是:
with open('app.log', 'r') as f:
do_something()
使用這種用法,我們不必呼叫close()方法,在with陳述句程式內部就會執行,無論內部是否出現例外,with陳述句被稱為背景關系管理器,我們可以暫且不管這個的原理,只需要知道使用with陳述句,關閉檔案的操作會被自動執行,這也是官方推薦的最佳用法,比用
檔案操作
寫入檔案
主要介紹兩個方法:
1.write()方法
這個方法的引數是一個單獨的字串,比如:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
s = ''
for data in lines:
s += data
s += '\n'
f.write(s)
其實更好的寫法是使用join函式:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.write('\n'.join(lines))
2.writelines()方法
引數是一組可迭代的字串,比如
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
new_lines = []
for data in lines:
new_lines.append(data+'\n')
f.writelines(new_lines)
其實更加優雅的寫法,可以使用生成器:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.writelines("%s\n" % l for l in lines)
讀取檔案
這里介紹四種用法,后面都默認檔案已經被打開了:
1.read()方法
result = f.read()
這里回傳的是檔案內容,是str型別的結果,這個方法還帶一個數值型別的引數,指定讀取多少內容,如果省略了或者是負數,那么就回傳檔案的全部內容,
2.readline()方法
result = f.readline()
回傳的也是字串,不過是一行內容,繼續呼叫,就會回傳下一行內容
3.readlines()方法
result = f.readlines()
這里回傳的是一個串列,但是當資料較大時,這樣的用法會很占用記憶體,不推薦在資料量大時使用
4.直接回圈檔案物件
for line in f:
print line
do_something()
這樣的用法節省記憶體,快速,并且代碼還簡單
result = f.readlines()
------------------------
result = list(f)
這兩種寫法回傳的結果是一樣的
顯然我們推薦第四種用法,
如何處理大檔案
大檔案主要問題在于占用記憶體較大,我們不能一下子將檔案全部內容讀入記憶體,最好的做法如下:
with open("log.txt") as f:
for line in f:
do_something_with(line)
一行一行讀取,記憶體不會爆,同時速度也更快,使用with陳述句,無論內部是否出現例外,在結束時,檔案物件都會被關閉,因此在處理大檔案時,最好這樣來做,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/230170.html
標籤:Python
