用Python讀取大檔案(上)

2021-07-07 04:16:46 字數 1656 閱讀 4719

通常我們在讀取檔案的時候,會用到read(), readline(), readlines()。 通常可能會有這樣的用法:

def test1():

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

print f.read()

或者

def test2():

f = open("/tmp/test.log", "r")

for line in f.readlines():

print line

f.close()

read ()的方法是一次性把檔案的內容以字串的方式讀到記憶體, 放到乙個字串變數中

readlines()的方法是一次性讀取所有內容, 並按行生成乙個list 

因為read()和readlines()是一次性把檔案載入到記憶體, 如果檔案較大, 甚至比記憶體的大小還大, 記憶體就會爆掉。 所以,這兩種方法只適合讀取小的檔案。 

實際工作中,會碰到讀取10幾g的大檔案的需求, 比如說日誌檔案。 這時候就要用的新的讀取檔案的方法。 這裡提供兩種方法, 有簡單,有複雜,但基本原理都是一樣的。 就是利用到生成器generator。 

方法一:

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

這裡會使用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

for line in f 這種用法是把檔案物件f當作迭代物件, 系統將自動處理io緩衝和記憶體管理, 這種方法是更加pythonic的方法。 比較簡潔。 

以上**均在python2.7環境除錯通過。 

本文大略講解了幾種處理檔案的方法, 並介紹了大檔案的正確開啟『姿勢』。 這裡提到了幾個概念: 分別是生成器,迭代器, 檔案物件。 你可能會對這些概念比較陌生, 沒關係, 我會在下篇再深入解釋這些。 

----------------------上篇完-------------------------------

【參考文獻】

1.  

2.  

3.  

4.  

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