文件是系統存儲區域的一個命名位置,用來存儲一些信息,便於後續訪問。可以在非易失性存儲器中實現持續性存儲,好比在硬盤上。當咱們要讀取或者寫入文件時,咱們須要打開文件;在操做完畢時,咱們須要關閉文件,以便釋放和文件操做相關的系統資源,所以,文件操做的主要包括如下:python
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的意思。追加模式和寫入模式的區別就是,寫入模式打開一個文件時,不管這個文件是否有內容,都會被清空再寫入;在使用追加模式時,打開的文件,只是在原有的內容上繼續進行寫入。同時咱們也要制定以文本模式打開仍是二進制模式打開。app
文本模式(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語句,不管內部是否出現異常,在結束時,文件對象都會被關閉,所以在處理大文件時,最好這樣來作。