python進行文件操作

  • 2020 年 3 月 17 日
  • 筆記

Linux系統中,萬物皆文件。一個用戶是一個文件,一張圖片是一個文件。文件是以一定數據結構存儲在硬碟中。 打開文件 讀取或者寫入 關閉文件 打開文件 Python使用內置的open()函數打開一個文件,並且返回一個文件對象,也叫句柄(handle)。

f = open("test.txt") # 在本文件夾下面的一個文件 再打開文件時,我們需要指定文件打開的模式, 當我們需要讀取文件時,使用f = open("test.txt", 'r'), 寫入文件時,使用f = open("test.txt", 'w'), 追加輸入時f = open("test.txt", 'a'),這裡的a就是append的意思。 追加模式和寫入模式的區別就是,寫入模式打開一個文件時,無論這個文件是否有內容,都會被清空再寫入; 在使用追加模式時,打開的文件,只是在原有的內容上繼續進行寫入。 同時我們也要指定以文本模式打開還是二進位模式(b)打開。

文本模式(text mode)和二進位(binary mode)模式的區別 文本模式中,讀取時作業系統的換行符('n' on Unix,'rn' on Windows)會被轉換成Python的默認換行符n,寫入時會將默認的換行符轉換為作業系統的換行符;在二進位模式中不會轉換。這個轉化在對文本文件沒有影響,但是對於二進位數據會有影響,比如影像文件或者EXE文件等。因此,再打開這類文件時,一般使用二進位模式進行讀寫 常用模式

| r | 文本模式,讀取 |

| rb | 二進位模式,讀取 |

| w | 文本模式,寫入 |

| wb | 二進位模式,寫入 |

| a | 文本模式,追加 |

| ab | 二進位模式,追加 |

| + | 可讀可寫 |

f = open("test.txt", 'r')  # 讀模式  f = open("test.txt", 'w')  # 寫模式  f = open("img.jpg",'r+')  # 可讀可寫  f = open("img.jpg",'w+')  # 可讀可寫  f = open("img.jpg",'rb')  # 二進位讀取

如何關閉文件 當文件操作結束時,我們最好主動關閉文件。儘管Python有垃圾回收(garbage collector)機制,去清理不用的對象,但是最好還是自己關閉文件。

最簡單的方法就是:

f = open("app.log", 'r')  do_something()  f.close()

但是這個辦法不安全,因為在進行其他操作時,可能會出現異常,程式退出,那麼關閉文件的語句就不會被執行。

因此,可以用<try-finally>語句來處理:

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語句,關閉文件的操作會被自動執行,這也是官方推薦的最佳用法,比用<try-finally>語句寫起來簡單。

文件操作 寫入文件 主要介紹兩個方法:

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("%sn" % 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語句,無論內部是否出現異常,在結束時,文件對象都會被關閉,因此在處理大文件時,非常推薦這種做法。