W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
你想在一個(gè)固定長(zhǎng)度記錄或者數(shù)據(jù)塊的集合上迭代,而不是在一個(gè)文件中一行一行的迭代。
通過下面這個(gè)小技巧使用 iter
和 functools.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)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: