簡述
在處理大資料時,有可能會碰到好幾個 G 大小的檔案。如果通過一些工具(例如:NotePad++)打開它,會發生錯誤,無法讀取任何内容。
那麼,在 Python 中,如何快速地讀取這些大檔案呢?
| 版權聲明:一去、二三裡,未經部落客允許不得轉載。
一般的讀取
讀取檔案,最常見的方式是:
with open('filename', 'r', encoding = 'utf-8') as f:
for line in f.readlines():
do_something(line)
但是,當完成這一操作時,
readlines()
方法(
read()
也一樣)會将整個檔案加載到記憶體中。在檔案較大時,往往會引發
MemoryError
(記憶體溢出)。
那麼,如何避免這個問題?
使用 fileinput 子產品
稍微好點兒的方式是使用
fileinput
子產品:
import fileinput
for line in fileinput.input(['filename']):
do_something(line)
調用
fileinput.input()
會按照順序讀取行,但是在讀取之後不會将它們保留在記憶體中。
逐行讀取
除此之外,也可使用
while()
循環和
readline()
來逐行讀取:
with open('filename', 'r', encoding = 'utf-8') as f:
while True:
line = f.readline() # 逐行讀取
if not line: # 到 EOF,傳回空字元串,則終止循環
break
do_something(line)
指定每次讀取的長度
有時,可能希望對每次讀取的内容進行更細粒度的控制。
在這種情況下,可以使用
iter
和
yield
:
def read_in_chunks(file_obj, chunk_size = 2048):
"""
逐件讀取檔案
預設塊大小:2KB
"""
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
自動管理
with open('filename', 'r', encoding = 'utf-8') as f:
for line in f:
do_something(line)
更多參考
- How to read large file, line by line in python