Python3 讀取大檔案

2022-06-25 13:54:07 字數 1840 閱讀 9992

********************= 1****************************************====

方法一:

將檔案切分成小段,每次處理完小段內容後,釋放記憶體

這裡會使用yield生成自定義可迭代物件, 即generator, 每乙個帶有yield的函式就是乙個generator。

def read_in_block(file_path):  

block_size = 1024  

with open(file_path, "r") as f:  

while true:  

block = f.read(block_size)  # 每次讀取固定長度到記憶體緩衝區  

if block:  

yield block  

else:  

return  # 如果讀取到檔案末尾,則退出  

def test3():  

file_path = "/tmp/test.log"  

for block in read_in_block(file_path):  

print block  

方法二:

利用open(「」, 「」)系統自帶方法生成的迭代物件

def test4():  

with open("/tmp/test.log") as f:  

for line in f:  

print line  

********************==2*********************************************

原帖子:  

該文章實際上提供了集中讀取大檔案的方式,先經過測試總結如下

1. for line in filehandle:

該方式是最快速的。而且python虛擬機器在內部幫助我們對buffer進行管理,記憶體佔用量小,且不差錯。

2. fileinput方式

該方式實際效果較慢,但是也有buffer管理功能

3. 使用file.read(sizehint)的方式進行區塊讀取

該方法是三者中最慢的,而且需要自己去控制記憶體和選擇需要的區域,所以在讀到的buffer之後,還需要進行拆分工作,比較麻煩,而且容易出錯。最無奈的是,使用下來(我的環境是2.6和2.7),sizehint作用較小,原來覺得如果sizehint是1024,則每次在記憶體中只會駐留1024b的內容,但是實際上不是這樣的,在度過一次1024b之後,再次讀取1024b的時候,儘管已經對之前的buf進行了del操作,但是該1024b仍然存留於記憶體中,所以記憶體越吃越大,最終memoryerror。

4. file.readline和file.readlines

和read類似,只適用於小檔案。

結論:在使用python進行大檔案讀取時,應該返璞歸真,使用最簡單的方式,交給直譯器,就管好自己的工作就行了

1. 大檔案(>1.4g)

所使用的方式

size_hint

所使用時間

for i in open(...) 

/103.382492s

fileinput         

/131.525755s

file.read和buffer控制

2億b報錯:memoryerror   

2. 小檔案(西遊記的txt,大約1.4m)

所使用的方式

size_hint

所使用時間

for i in open(...) 

/2.11s

fileinput         

/4.22s

file.read和buffer控制

2億b4.07s

python3 讀取大檔案分解成若干小檔案

有個資料實在太大了,有1.7g,開啟慢,改檔案也慢,我們將其分解成若干個中等檔案 coding utf 8 f open 123.sql r encoding utf 8 readlist i 0i i 1filename mytest sql format i wf open filename,w...

python 3讀取檔案 Python3 檔案讀寫

python open 方法用於開啟乙個檔案,並返回檔案物件,在對檔案進行處理過程都需要使用到這個函式 1.讀取檔案 with open test json dumps.txt mode r encoding utf 8 as f seek 移動游標至指定位置 f.seek 0 read 讀取整個檔...

python 讀取大檔案

以前一直沒有關注過python讀取大檔案的問題,因為一直都是順順暢暢地讀取了檔案。直到今天有人問我python怎麼讀取檔案出現了記憶體不足的錯誤?我才發現原來大檔案 gb級別 的讀取和普通檔案的讀取是不一樣的。下面介紹三種我親測可用的方法。這裡的檔案型別可以是txt,dat等型別的檔案。用read ...