Python 讀取大檔案
阿新 • • 發佈:2019-01-04
最近在學習python的過程中接觸到了python對檔案的讀取。python讀取檔案一般情況是利用open()函式以及read()函式來完成:
f = open(filename,'r') f.read()
這種方法讀取小檔案,即讀取遠遠大小小於記憶體的檔案顯然沒有什麼問題。但是如果是將一個10G大小的日誌檔案讀取,即檔案大於記憶體的大小,這麼處理就有問題了,會造成MemoryError ... 也就是發生記憶體溢位。
發生這種錯誤的原因在於,read()方法執行操作是一次性的都讀入記憶體中,顯然檔案大於記憶體就會報錯。
解決方法:
這裡發現跟read()類似的還有其他的方法:read(引數)、readline()、readlines()
(1)read(引數):通過引數指定每次讀取的大小長度,這樣就避免了因為檔案太大讀取出問題。
while True: block = f.read(1024) if not block: break
(2)readline():每次讀取一行
while True: line = f.readline() if not line: break
(3)readlines():讀取全部的行,構成一個list,通過list來對檔案進行處理,但是這種方式依然會造成MemoyError
for line in f.readlines(): ....
以上基本分析了python中讀取檔案的方法,但是總感覺不能達到python中所強調的優雅,後來發現了還有下面的解決方法:
pythonic(我理解的是很python的python程式碼)的解決辦法:
with open(filename, 'r') as flie: for line in file: ....
對可迭代物件file進行迭代,這樣會自動的使用buffered IO以及記憶體管理,這樣就不必擔心大檔案問題了。
後來,又發現了一個模組:linecache,這個模組也可以解決大檔案讀取的問題,並且可以指定讀取哪一行,
# 輸出第2行 text = linecache.getline(filename, 2)