5.8 固定大小記錄的文件迭代

2018-02-24 15:26 更新

問題

你想在一個(gè)固定長(zhǎng)度記錄或者數(shù)據(jù)塊的集合上迭代,而不是在一個(gè)文件中一行一行的迭代。

解決方案

通過下面這個(gè)小技巧使用 iterfunctools.partial() 函數(shù):

from functools import partial

RECORD_SIZE = 32

with open('somefile.data', 'rb') as f:
    records = iter(partial(f.read, RECORD_SIZE), b'')
    for r in records:
        ...

這個(gè)例子中的 records 對(duì)象是一個(gè)可迭代對(duì)象,它會(huì)不斷的產(chǎn)生固定大小的數(shù)據(jù)塊,直到文件末尾。要注意的是如果總記錄大小不是塊大小的整數(shù)倍的話,最后一個(gè)返回元素的字節(jié)數(shù)會(huì)比期望值少。

討論

iter() 函數(shù)有一個(gè)鮮為人知的特性就是,如果你給它傳遞一個(gè)可調(diào)用對(duì)象和一個(gè)標(biāo)記值,它會(huì)創(chuàng)建一個(gè)迭代器。這個(gè)迭代器會(huì)一直調(diào)用傳入的可調(diào)用對(duì)象直到它返回標(biāo)記值為止,這時(shí)候迭代終止。

在例子中,functools.partial 用來創(chuàng)建一個(gè)每次被調(diào)用時(shí)從文件中讀取固定數(shù)目字節(jié)的可調(diào)用對(duì)象。標(biāo)記值 b'' 就是當(dāng)?shù)竭_(dá)文件結(jié)尾時(shí)的返回值。

最后再提一點(diǎn),上面的例子中的文件時(shí)以二進(jìn)制模式打開的。如果是讀取固定大小的記錄,這通常是最普遍的情況。而對(duì)于文本文件,一行一行的讀取(默認(rèn)的迭代行為)更普遍點(diǎn)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)