Python 大檔案處理

2022-04-10 17:02:31 字數 2220 閱讀 8694

非記憶體資源可以使用with

在我們日常工作中,難免會有處理日誌檔案的時候,當檔案小的時候,基本不用當心什麼,直接用file.read()或readlines()就可以了,但是如果是將乙個10g大小的日誌檔案讀取,即檔案大於記憶體的大小,這麼處理就有問題了,會將整個檔案載入到記憶體中從而造成memoryerror … 也就是發生記憶體溢位。

with open('file_name', 'r') as file:

for line in file:

print line

正常情況使用上面這種方式就可以了,but,如果遇到整個檔案只有一行,而且按照特定的字元進行分割,上面這種方式則不行了,這時候yield就非常有用了。

舉個栗子,log的形式是這樣子的。

def read_line(filename, split, size):

with open(filename, 'r+') as file:

buff = ''

while true:

while split in buff:

position = buff.index(split)

yield buff[:position]

buff = buff[(position +len(split)):]

chunk = file.read(size)

if not chunk:

yield buff

break

buff = buff +chunk

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 #如果讀取到檔案末尾,則退出

for block in read_in_block(file_path):

print block

// 這個方法,速度很快(只有3s),但有個問題,若滿足了1024時,會將正好在1024位置的資料切開,雖然每個block都是str, 但無法直接得到每行的id,只能再切分。
def readinchunks(fileobj, chunksize=4096):

"""lazy function to read a file piece by piece.

default chunk size: 4kb.

"""while 1:

data = fileobj.read(chunksize)

if not data:

break

yield data

f = open('bigfile')

for chuck in readinchunks(f):

#do_something(chunk)

f.close()

python 中使用hashlib模組實現常見摘要演算法,如md5、sha1等。

hashlib.md5(檔案內容)實現了對檔案的md5計算,注意引數為檔案內容而不是檔案路徑。

import hashlib

with open('2.jpeg','rb') as f:

data = f.read()

d5 = hashlib.md5(data)

print(d5.hexdigest())

md5()返回的是md5物件,不是md5值,通過hexdigest()方法獲取md5值。

md5計算時檔案資料是放在記憶體中的,當我們計算乙個大檔案時,可以用update方法進行分步計算,每次新增部分檔案資料進行計算,減少記憶體占用。

import hashlib

d5 = hashlib.md5()

with open('3.jpeg','rb') as f:

while true:

data = f.read(2024)

if not data:

break

d5.update(data) #update新增時會進行計算

print(d5.hexdigest()) #列印結果

Python 大檔案處理

非記憶體資源可以使用with 在python中逐行讀取大檔案 在我們日常工作中,難免會有處理日誌檔案的時候,當檔案小的時候,基本不用當心什麼,直接用file.read 或readlines 就可以了,但是如果是將乙個10g大小的日誌檔案讀取,即檔案大於記憶體的大小,這麼處理就有問題了,會將整個檔案載...

c 處理大檔案

最近寫乙個小工程,要讀寫大檔案,10 20g。開始經過一番考慮,考慮到c函式的高效與操作難度 以前用c的函式,總忘關檔案 直接使用了c 的ifstream,用類操作比較方便。由於隨機讀取檔案位置,所以需要找辦法能讀取到任一位置,這在處理小檔案時沒有問題,但在處理大於4g檔案時出現了問題。以前在lin...

大檔案處理 記憶體檔案對映

記憶體對映檔案,是由乙個檔案到一塊記憶體的對映。與虛擬記憶體有些類似,通過記憶體對映檔案可以保留乙個位址空間的區域,同時將物理儲存器提交給此區域,記憶體檔案對映的物理儲存器來自乙個已經存在的磁碟上的檔案,而且在對該檔案進行操作之前必須首先對檔案進行對映。另外,記憶體對映檔案是由乙個檔案到程序位址空間...