在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
已经为您准备好了。

多大?如果你设计了文件格式,考虑改变它,以便它可以在单次扫描中容易地被解析。这里只是对你的代码的一个注释: in Fin。RealLink()/<代码>在你的内存中的一行列表中循环。代码>用于fin中的行
但是会从文件中读取一行,然后读取另一行等等…@simon Oh dear。谢谢也许可以将if-else转换成三元?@Basic
i+=-num\u行,如果x==23 else 1
看起来很远uglier@Nirk我不同意,但这是优先权的问题。我不明白这是如何回答这个问题的。我似乎设置了一个变量,但实际上并没有读回原来的一行。这不是会变成一个无限循环吗?如果我能猜到需要向后跳的最大值,这可能会起作用。@felix:编辑了我的答案,允许你向后跳变行数。太棒了!我知道一定有可能在文件中记录你的位置!太好了,谢谢。缺点是linestarts会随着文件大小的增加而增加,因此仅存储行所节省的空间量可能会有所不同。如果您知道可以向后跳过的最大行数,那么您可以将LineStart设置为出列。