最近處理文字文件時(檔案約2gb大小),出現memoryerror
錯誤和檔案讀取太慢的問題,後來找到了兩種比較快large file reading
的方法,本文將介紹這兩種讀取方法。
原味位址
我們談到「文字處理」時,我們通常是指處理的內容。python 將文字檔案的內容讀入可以操作的字串變數非常容易。檔案物件提供了三個「讀」方法:.read()
、.readline()
和.readlines()
。每種方法可以接受乙個變數以限制每次讀取的資料量,但它們通常不使用變數。.read()
每次讀取整個檔案,它通常用於將檔案內容放到乙個字串變數中。然而.read()
生成檔案內容最直接的字串表示,但對於連續的面向行的處理,它卻是不必要的,並且如果檔案大於可用記憶體,則不可能實現這種處理。下面是read()
方法示例:
try:f = open('
/path/to/file
', 'r'
f.read()
finally:if
f:f.close()
呼叫read()
會一次性讀取檔案的全部內容,如果檔案有10g,記憶體就爆了,所以,要保險起見,可以反覆呼叫read(size)
方法,每次最多讀取size個位元組的內容。另外,呼叫readline()
可以每次讀取一行內容,呼叫readlines()
一次讀取所有內容並按行返回list。因此,要根據需要決定怎麼呼叫。
如果檔案很小,read()
一次性讀取最方便;如果不能確定檔案大小,反覆呼叫read(size)
比較保險;如果是配置檔案,呼叫readlines()
最方便:
for line inf.readlines():
process(line)
#
處理大檔案是很容易想到的就是將大檔案分割成若干小檔案處理,處理完每個小檔案後釋放該部分記憶體。這裡用了iter 和 yield
:
def read_in_chunks(filepath, chunk_size=1024*1024):"""lazy function (generator) to read a file piece by piece.
default chunk size: 1m
you can set your own chunk size
"""file_object =open(filepath)
while
true:
chunk_data =file_object.read(chunk_size)
ifnot
chunk_data:
break
yield
chunk_data
if__name__ == "
__main__":
filepath = '
./path/filename
'for chunk in
read_in_chunks(filepath):
process(chunk)
#
with
語句開啟和關閉檔案,包括丟擲乙個內部塊異常。for line in f
檔案物件f
視為乙個迭代器,會自動的採用緩衝io
和記憶體管理,所以你不必擔心大檔案。
**如下:
#if the file is line based
with open(...) as f:
for line in
f: process(line)
#
面對百萬行的大型資料使用with open 是沒有問題的,但是這裡面引數的不同也會導致不同的效率。經過測試發先引數為"rb"時的效率是"r"的6倍。由此可知二進位制讀取依然是最快的模式。
with open(filename,"rb") as f:
for fline in
f:
pass
測試結果:rb方式最快,100w行全遍歷2.9秒。基本能滿足中大型檔案處理效率需求。如果從rb
(二級制讀取)讀取改為r(讀取模式),慢5-6倍。
在使用python進行大檔案讀取時,應該讓系統來處理,使用最簡單的方式,交給直譯器,就管好自己的工作就行了。同時根據不同的需求可以選擇不同的讀取引數進一步獲得更高的效能。
python 讀取大檔案
以前一直沒有關注過python讀取大檔案的問題,因為一直都是順順暢暢地讀取了檔案。直到今天有人問我python怎麼讀取檔案出現了記憶體不足的錯誤?我才發現原來大檔案 gb級別 的讀取和普通檔案的讀取是不一樣的。下面介紹三種我親測可用的方法。這裡的檔案型別可以是txt,dat等型別的檔案。用read ...
python讀取大檔案
最近在學習python的過程中接觸到了python對檔案的讀取。python讀取檔案一般情況是利用open 函式以及read 函式來完成 f open filename,r f.read 這種方法讀取小檔案,即讀取遠遠大小小於記憶體的檔案顯然沒有什麼問題。但是如果是將乙個10g大小的日誌檔案讀取,即...
python讀取大檔案 python讀取大檔案
python讀取檔案對各列進行索引 可以用readlines,也可以用readline,如果是大檔案一般就用readlined a in open testfile.txt r for line in a in columnssplit line.rstrip split d columnsspli...