这是一个文件的外观:
BEGIN_META
stuff
to
discard
END_META
BEGIN_DB
header
to
discard
data I
wish to
extract
END_DB
我希望能够解析它们所有的无限流cat
,这排除了做类似re.findall('something useful', '\n'.join(sys.stdin), re.M)
.
以下是我的尝试,但我必须强制从其中返回生成器,get_raw_table()
因此它不太符合要求。去掉力意味着你无法测试返回的生成器是否为空,所以你看不到是否sys.stdin
为空。
def get_raw_table(it):
state = 'begin'
for line in it:
if line.startswith('BEGIN_DB'):
state = 'discard'
elif line.startswith('END_DB'):
return
elif state is 'discard' and not line.strip():
state = 'take'
elif state is 'take' and line:
yield line.strip().strip('#').split()
# raw_tables is a list (per file) of lists (per row) of lists (per column)
raw_tables = []
while True:
result = list(get_raw_table(sys.stdin))
if result:
raw_tables.append(result)
else:
break