将文件向后重新定位到多行(python)
我正在使用Python读取以下格式的文件: iter1将文件向后重新定位到多行(python),python,seek,Python,Seek,我正在使用Python读取以下格式的文件: iter1 iter2 iter3 [n行内容] 标志=值 iter1 iter2 iter3 iter4 iter5 [n行内容] 标志=值 等等 我想搜索FLAG,读取该值,然后倒回'n'行,读取最终迭代的值。请注意,迭代次数并不总是相同的。每个文件中的行数“n”是一致的;但是,这些行可能包含不同的字节数,因此使用seek功能时遇到问题 我想这样做: f = open(file) for i in f: a = re.search(
iter2
iter3
[n行内容]
标志=值 iter1
iter2
iter3
iter4
iter5
[n行内容]
标志=值
等等 我想搜索FLAG,读取该值,然后倒回'n'行,读取最终迭代的值。请注意,迭代次数并不总是相同的。每个文件中的行数“n”是一致的;但是,这些行可能包含不同的字节数,因此使用seek功能时遇到问题 我想这样做:
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
假设你的“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
一般来说,最简单的方法是一次读取一个文件,并在以后经过时记住所需的位。对于此类问题,一般来说,您可以按块读取和处理文件:
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
函数中的逻辑可能不是最优的,甚至可能是错误的。你能把整个文件读入内存吗?还是太大了?我想他应该返回n行,而不仅仅是一行。他必须返回多少行并不重要。他想要最后一行iter
,即[n行内容]
之前的那一行(在他的第一个数据集中是iter3
,在第二个数据集中是iter5
)。