在python中的文件中向后跳
我正在使用在python中的文件中向后跳,python,Python,我正在使用 for line in fin: process(line) 然而,我有时想跳过文件中的一些行,然后继续。我不会提前知道行数,因为这取决于代码中的计算。所以我希望它是这样的 for line in fin: x = process(line) if (x == 23): skip back xxx lines and continue lines = fin.readlines() i = 0 while i < len(lines)
for line in fin:
process(line)
然而,我有时想跳过文件中的一些行,然后继续。我不会提前知道行数,因为这取决于代码中的计算。所以我希望它是这样的
for line in fin:
x = process(line)
if (x == 23):
skip back xxx lines and continue
lines = fin.readlines()
i = 0
while i < len(lines):
x = process(lines[i])
if x == 23:
i -= num_lines
else:
i += 1
如何在python中实现这一点
例如,这是可以用mmap实现的吗?文件很大,所以我不想把整个文件都存储在内存中。试试类似的方法
for line in fin:
x = process(line)
if (x == 23):
skip back xxx lines and continue
lines = fin.readlines()
i = 0
while i < len(lines):
x = process(lines[i])
if x == 23:
i -= num_lines
else:
i += 1
lines=fin.readlines()
i=0
而i
另一种方法:
In [11]: from collections import deque
In [12]: cache = deque(maxlen=max_skip_back)
In [13]: for line in fin:
....: line = line.strip()
....: cache.append(line)
....: x = process(line)
....: if x == 23:
....: for line in cache[-this_skip_back:]:
....: process(line)
这不会将整个文件读入内存。如果数据块的长度超过
maxlen
我建议在执行时使用file对象上的tell()方法记录数组中每一行的位置,那么它们会删除第一个元素。这将在遇到每条线时提供到该线位置的偏移。然后,如果要向后跳,可以使用f.seek()向后跳到指定的位置
例如:
linestarts = []
f = open(myfile,"r")
...
linestarts.append(f.tell()) # save each line
f.readline() # do stuff reading a line
...
# want to jump back 3 lines for some reason
f.seek( linestarts[-3] )
当然,另一种选择是在自己的代码中缓存最后几行,但这就是stdio
已经为您准备好了。多大?如果你设计了文件格式,考虑改变它,以便它可以在单次扫描中容易地被解析。这里只是对你的代码的一个注释:
i+=-num\u行,如果x==23 else 1
看起来很远uglier@Nirk我不同意,但这是优先权的问题。我不明白这是如何回答这个问题的。我似乎设置了一个变量,但实际上并没有读回原来的一行。这不是会变成一个无限循环吗?如果我能猜到需要向后跳的最大值,这可能会起作用。@felix:编辑了我的答案,允许你向后跳变行数。太棒了!我知道一定有可能在文件中记录你的位置!太好了,谢谢。缺点是linestarts会随着文件大小的增加而增加,因此仅存储行所节省的空间量可能会有所不同。如果您知道可以向后跳过的最大行数,那么您可以将LineStart设置为出列。