如果“N”只能开始一行,那么为什么不使用“simple”解决方案呢?(这听起来已经完成了,我正在努力加强/支持它;-)
也就是说,一次只读取一行,然后构建表示当前N个对象的数据。假设N=0和N=1加载后,将它们一起处理,然后移动到下一对(N=2,N=3)。唯一稍微有点棘手的是确保不要抛出一个读行。(决定结束条件(例如“N”)的读取行也包含下一个N的数据)。
除非需要查找(或者IO缓存被禁用,或者每个项目有大量的数据),否则没有理由不使用readline AFAIK。
快乐的编码。
下面是一些即兴代码,可能包含多个错误。在任何情况下,它都显示了使用最小化副作用方法的总体思路。# given an input and previous item data, return either
# [item_number, data, next_overflow] if another item is read
# or None if there are no more items
def read_item (inp, overflow):
data = overflow or ""
# this can be replaced with any method to "read the header"
# the regex is just "the easiest". the contract is just:
# given "N ....", return N. given anything else, return None
def get_num(d):
m = re.match(r"(\d+) ", d)
return int(m.groups(1)) if m else None
for line in inp:
if data and get_num(line) ne None:
# already in an item (have data); current line "overflows".
# item number is still at start of current data
return [get_num(data), data, line]
# not in item, or new item not found yet
data += line
# and end of input, with data. only returns above
# if a "new" item was encountered; this covers case of
# no more items (or no items at all)
if data:
return [get_num(data), data, None]
else
return None
用法可能类似于以下内容,其中f表示打开的文件:# check for error conditions (e.g. None returned)
# note feed-through of "overflow"
num1, data1, overflow = read_item(f, None)
num2, data2, overflow = read_item(f, overflow)