天天看點

Python 讀取大檔案

簡述

在處理大資料時,有可能會碰到好幾個 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​​