最近處理文字文件時(檔案約2gb大小),出現memoryerror
錯誤和檔案讀取太慢的問題,後來找到了兩種比較快large file reading
的方法,本文將介紹這兩種讀取方法。
我們談到「文字處理」時,我們通常是指處理的內容。python 將文字檔案的內容讀入可以操作的字串變數非常容易。檔案物件提供了三個「讀」方法:.read()
、.readline()
和.readlines()
。每種方法可以接受乙個變數以限制每次讀取的資料量,但它們通常不使用變數。.read()
每次讀取整個檔案,它通常用於將檔案內容放到乙個字串變數中。然而.read()
生成檔案內容最直接的字串表示,但對於連續的面向行的處理,它卻是不必要的,並且如果檔案大於可用記憶體,則不可能實現這種處理。下面是read()
方法示例:
try: f = open('
/path/to/file
', 'r'
)
f.read()
finally
:
iff:
f.close()
呼叫read()
會一次性讀取檔案的全部內容,如果檔案有10g,記憶體就爆了,所以,要保險起見,可以反覆呼叫read(size)
方法,每次最多讀取size個位元組的內容。另外,呼叫readline()
可以每次讀取一行內容,呼叫readlines()
一次讀取所有內容並按行返回list。因此,要根據需要決定怎麼呼叫。
如果檔案很小,read()
一次性讀取最方便;如果不能確定檔案大小,反覆呼叫read(size)
比較保險;如果是配置檔案,呼叫readlines()
最方便:
defprocess(str)
(str)
for line in
f.readlines():
process(line)
#
處理大檔案是很容易想到的就是將大檔案分割成若干小檔案處理,處理完每個小檔案後釋放該部分記憶體。這裡用了iter & yield
:
def read_in_chunks(filepath, chunk_size=1024*1024):file = open("sample.txt")"""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) #或者
while 1:
lines = file.readlines(100000)
if not lines:
break
for line in lines:
pass # do something
python中用with語句開啟和關閉檔案,包括了丟擲乙個內部塊異常,並且,for line in f其實是將檔案物件f視為乙個迭代器,自動的採用緩衝io和記憶體管理,所以不必擔心大檔案。讓系統來處理,其實是最簡單的方式,交給直譯器#if the file is line based
with open(...) as f:
for line in
f: process(line)
#
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...