1. 程式人生 > 其它 >python之如何高效操作大檔案

python之如何高效操作大檔案

前言

在日常的測試開發工作中,需要經常對檔案進行處理,如對日誌檔案的分析,對資料檔案的遍歷,如果遇到比較大的檔案,那就要求程式的健壯性有更高的要求。

例項

1、現以讀取一個大小為900M的檔案為例,現已常用的檔案處理方式把每行內容打印出來,並記錄處理時間。

start=time.time()
with open(
"/Users/xxx/Downloads/絕命毒師.mp4", "rb") as fp: print(fp.read())
end
=time.time() eplase=end-start print(eplase)

執行結果:

(列印內容省略)
...
...
...
230.72680592536926

解析:

執行程式可以看到,Pycharm的控制檯也是等了差不多60S後才有顯示的內容,這是因為程式要先把檔案所有內容讀取放入記憶體中然後再對檔案的內容做逐行列印,整個處理時間花費了230S,如果檔案更大的話這種處理邏輯還有可能報記憶體溢位的錯誤。

優化:

為防止記憶體溢位的異常場景出現,對上述處理邏輯進行優化改進,不再將所有內容一次性讀取,而是每次讀取固定大小內容,直至檔案讀取完畢

start=time.time()

f = open("/Users/xxx/Downloads/絕命毒師.mp4", 'rb')

while True:
    block = f.read(2048)
    
print(block) if not block: break
f.close() end=time.time() eplase=end-start print(eplase)

解析:

執行程式可以看到,控制檯實時列印每次讀取的內容,且整體執行時間為 36.65S,效率得到了大大的提升。讀取更大容量的檔案也沒問題。

2、利用生成器函式也是讀取大容量檔案的利器之一

def read_file(fpath):
    BLOCK_SIZE = 2048
    with open(fpath, 'rb') as f:
        while True:
            block 
= f.read(BLOCK_SIZE) if block: yield block else: return "over" start = time.time() a = read_file("/Users/xxx/Downloads/絕命毒師.mp4") for i in a: print(i) end=time.time() eplase=end-start print(eplase)

執行結果:

(列印內容省略)
...
...
...
35.480741024017334

解析:

可以看到,執行程式控制臺也是實時列印每次讀取的內容,且整體執行時間為 35.48S,效率和每次固定讀取內容的方法大致相同。