5.8 固定大å°�记录的文件è¿ä»£Â¶
问题¶
ä½ æƒ³åœ¨ä¸€ä¸ªå›ºå®šé•¿åº¦è®°å½•æˆ–è€…æ•°æ�®å�—的集å�ˆä¸Šè¿ä»£ï¼Œè€Œä¸�是在一个文件ä¸ä¸€è¡Œä¸€è¡Œçš„è¿ä»£ã€‚
解决方案¶
通过下�这个�技巧使用 iter 和 functools.partial() 函数:
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 对象是一个å�¯è¿ä»£å¯¹è±¡ï¼Œå®ƒä¼šä¸�æ–的产生固定大å°�的数æ�®å�—,直到文件末尾。
è¦�注æ„�的是如果总记录大å°�ä¸�是å�—大å°�的整数å€�çš„è¯�,最å�Žä¸€ä¸ªè¿”å›žå…ƒç´ çš„å—节数会比期望值少。
讨论¶
iter() å‡½æ•°æœ‰ä¸€ä¸ªé²œä¸ºäººçŸ¥çš„ç‰¹æ€§å°±æ˜¯ï¼Œå¦‚æžœä½ ç»™å®ƒä¼ é€’ä¸€ä¸ªå�¯è°ƒç”¨å¯¹è±¡å’Œä¸€ä¸ªæ ‡è®°å€¼ï¼Œå®ƒä¼šåˆ›å»ºä¸€ä¸ªè¿ä»£å™¨ã€‚
这个è¿ä»£å™¨ä¼šä¸€ç›´è°ƒç”¨ä¼ 入的å�¯è°ƒç”¨å¯¹è±¡ç›´åˆ°å®ƒè¿”å›žæ ‡è®°å€¼ä¸ºæ¢ï¼Œè¿™æ—¶å€™è¿ä»£ç»ˆæ¢ã€‚
在例å�ä¸ï¼Œ functools.partial 用æ�¥åˆ›å»ºä¸€ä¸ªæ¯�次被调用时从文件ä¸è¯»å�–固定数目å—节的å�¯è°ƒç”¨å¯¹è±¡ã€‚
æ ‡è®°å€¼ b'' 就是当到达文件结尾时的返回值。
最å�Žå†�æ��一点,上é�¢çš„例å�ä¸çš„æ–‡ä»¶æ—¶ä»¥äºŒè¿›åˆ¶æ¨¡å¼�打开的。 如果是读å�–固定大å°�的记录,这通常是最普é��的情况。 而对于文本文件,一行一行的读å�–(默认的è¿ä»£è¡Œä¸º)æ›´æ™®é��点。