《Python Cookbook 3rd》笔记(5.8):固定大小记录的文件迭代
固定大小記錄的文件迭代
問(wèn)題
你想在一個(gè)固定長(zhǎng)度記錄或者數(shù)據(jù)塊的集合上迭代,而不是在一個(gè)文件中一行一行的迭代。
解法
通過(guò)下面這個(gè)小技巧使用 iter 和 functools.partial() 函數(shù):
from functools import partialRECORD_SIZE = 32with 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 用來(lái)創(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)。
總結(jié)
以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(5.8):固定大小记录的文件迭代的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《Python Cookbook 3rd
- 下一篇: 用Python去除扫描型PDF中的水印