我使用Python来读取以下格式的文件:
iter1
iter2
iter3
[n行的东西]
FLAG =值
iter1
iter2
iter3
iter4
iter5
[n行的东西]
FLAG =值
等....
我想搜索FLAG,读取该值,然后按'n'行回退并读取最终迭代的值。请注意,迭代次数并不总是相同。行'n'的行数在每个文件中是一致的;但是,这些行可能包含不同的字节数,因此我无法使用搜索功能。
我想做这样的事情:
f = open(file)
for i in f:
a = re.search('FLAG')
if a:
print a
spot=f.tell() #mark original spot
f.seek(-n,1) #rewind by n lines
b = re.search('iter')
print b
f.seek(spot) #return to FLAG line, continue to next data set
答案 0 :(得分:1)
假设你的“n行东西”不包含任何以“iter”开头的行,你就会比这更难解决问题。您需要做的就是跟踪您看到的以“iter”开头的最后一行。然后,当你看到“FLAG =”时,你已经拥有了这些数据;无需“倒带”并寻找它。
lastiterline = None
with open(filename) as f:
for line in f:
line = line.strip()
if line.startswith("iter"):
lastiterline = line
elif line.startswith("FLAG"):
if lastiterline:
print line
print lastiterline
lastiterline = None
一般来说,最简单的方法是读取一次文件并记住以后需要的位数。
答案 1 :(得分:0)
对于一般的此类问题,您可以逐块读取和处理文件:
def flagblocks(filename):
with open(filename) as f:
yieldlist = []
for line in f:
if not line.strip():
continue
if not line.startswith("FLAG"):
yieldlist.append(line)
continue
yield yieldlist
yieldlist = []
yield yieldlist
for flagblock in flagblocks("filename"):
process_flagblock_lines(flagblock)
你特殊情况下的处理功能仍然与kindall建议基本相同。
flagblocks
函数中的逻辑可能不是最佳的,甚至可能是错误的。