Python 讀取大檔案(GB)

2022-07-13 15:03:11 字數 2260 閱讀 3189

最近處理文字文件時(檔案約2gb大小),出現memoryerror錯誤和檔案讀取太慢的問題,後來找到了兩種比較快large file reading的方法,本文將介紹這兩種讀取方法。

我們談到「文字處理」時,我們通常是指處理的內容。python 將文字檔案的內容讀入可以操作的字串變數非常容易。檔案物件提供了三個「讀」方法:.read().readline().readlines()。每種方法可以接受乙個變數以限制每次讀取的資料量,但它們通常不使用變數。.read()每次讀取整個檔案,它通常用於將檔案內容放到乙個字串變數中。然而.read()生成檔案內容最直接的字串表示,但對於連續的面向行的處理,它卻是不必要的,並且如果檔案大於可用記憶體,則不可能實現這種處理。下面是read()方法示例:

try

: f = open('

/path/to/file

', 'r'

)

print

f.read()

finally

:

iff:

f.close()

呼叫read()會一次性讀取檔案的全部內容,如果檔案有10g,記憶體就爆了,所以,要保險起見,可以反覆呼叫read(size)方法,每次最多讀取size個位元組的內容。另外,呼叫readline()可以每次讀取一行內容,呼叫readlines()一次讀取所有內容並按行返回list。因此,要根據需要決定怎麼呼叫。

如果檔案很小,read()一次性讀取最方便;如果不能確定檔案大小,反覆呼叫read(size)比較保險;如果是配置檔案,呼叫readlines()最方便:

def

process(str)

print

(str)

for line in

f.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) #或者

file = open("sample.txt")

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...