Python 大檔案處理

2021-10-12 02:14:44 字數 3113 閱讀 1079

非記憶體資源可以使用with

在python中逐行讀取大檔案

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

對file物件進行迭代處理:

with

open

('file_name'

,'r')as

file

:for line in

file

:print line

優點:

缺點:

每一行的資料內容不能大於記憶體大小,否則就會造成memoryerror

使用yield

正常情況使用上面這種方式就可以了,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)

ifnot chunk:

yield buff

break

buff = buff +chunk

優點:

不在限制每行資料的大小,即使整個大檔案只有一行。

缺點:

讀取大幾g的大檔案,可以利用生成器 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

#如果讀取到檔案末尾,則退出

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.

"""while1:

data = fileobj.read(chunksize)

ifnot data:

break

yield data

f =open

('bigfile'

)for chuck in readinchunks(f)

:#do_something(chunk)

f.close(

)

python 實現大檔案md5值計算

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 在我們日常工作中,難免會有處理日誌檔案的時候,當檔案小的時候,基本不用當心什麼,直接用file.read 或readlines 就可以了,但是如果是將乙個10g大小的日誌檔案讀取,即檔案大於記憶體的大小,這麼處理就有問題了,會將整個檔案載入到記憶體中從而造成memory...

c 處理大檔案

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

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

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