簡述
在處理大數(shù)據(jù)時,有可能會碰到好幾個 G 大小的文件。如果通過一些工具(例如:NotePad++)打開它,會發(fā)生錯誤,無法讀取任何內(nèi)容。
那么,在 Python 中,如何快速地讀取這些大文件呢?
版權(quán)所有:一去丶二三里,轉(zhuǎn)載請注明出處:http://blog.csdn.net/liang19890820
一般的讀取
讀取文件,最常見的方式是:
with open('filename', 'r', encoding = 'utf-8') as f:
for line in f.readlines():
do_something(line)
但是,當(dāng)完成這一操作時,readlines() 方法(read() 也一樣)會將整個文件加載到內(nèi)存中。在文件較大時,往往會引發(fā) MemoryError (內(nèi)存溢出)。
那么,如何避免這個問題?
使用 fileinput 模塊
稍微好點(diǎn)兒的方式是使用 fileinput 模塊:
import fileinput
for line in fileinput.input(['filename']):
do_something(line)
調(diào)用 fileinput.input() 會按照順序讀取行,但是在讀取之后不會將它們保留在內(nèi)存中。
逐行讀取
除此之外,也可使用 while() 循環(huán)和 readline() 來逐行讀取:
with open('filename', 'r', encoding = 'utf-8') as f:
while True:
line = f.readline() # 逐行讀取
if not line: # 到 EOF,返回空字符串,則終止循環(huán)
break
do_something(line)
指定每次讀取的長度
有時,可能希望對每次讀取的內(nèi)容進(jìn)行更細(xì)粒度的控制。
在這種情況下,可以使用 iter 和 yield :
def read_in_chunks(file_obj, chunk_size = 2048):
"""
逐件讀取文件
默認(rèn)塊大?。?KB
"""
while True:
data = file_obj.read(chunk_size) # 每次讀取指定的長度
if not data:
break
yield data
with open('filename', 'r', encoding = 'utf-8') as f:
for chuck in read_in_chunks(f):
do_something(chunk)
自動管理
這才是 Pythonci 最完美的方式,既高效又快速:
with open('filename', 'r', encoding = 'utf-8') as f:
for line in f:
do_something(line)
with 語句句柄負(fù)責(zé)打開和關(guān)閉文件(包括在內(nèi)部塊中引發(fā)異常時),for line in f 將文件對象 f 視為一個可迭代的數(shù)據(jù)類型,會自動使用 IO 緩存和內(nèi)存管理,這樣就不必?fù)?dān)心大文件了。
更多參考
|