W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
你想在一個固定長度記錄或者數(shù)據(jù)塊的集合上迭代,而不是在一個文件中一行一行的迭代。
通過下面這個小技巧使用 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:
...
這個例子中的 records
對象是一個可迭代對象,它會不斷的產(chǎn)生固定大小的數(shù)據(jù)塊,直到文件末尾。要注意的是如果總記錄大小不是塊大小的整數(shù)倍的話,最后一個返回元素的字節(jié)數(shù)會比期望值少。
iter()
函數(shù)有一個鮮為人知的特性就是,如果你給它傳遞一個可調(diào)用對象和一個標(biāo)記值,它會創(chuàng)建一個迭代器。這個迭代器會一直調(diào)用傳入的可調(diào)用對象直到它返回標(biāo)記值為止,這時候迭代終止。
在例子中,functools.partial
用來創(chuàng)建一個每次被調(diào)用時從文件中讀取固定數(shù)目字節(jié)的可調(diào)用對象。標(biāo)記值 b''
就是當(dāng)?shù)竭_文件結(jié)尾時的返回值。
最后再提一點,上面的例子中的文件時以二進制模式打開的。如果是讀取固定大小的記錄,這通常是最普遍的情況。而對于文本文件,一行一行的讀取(默認的迭代行為)更普遍點。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: