0

我正在使用

for line in fin:
    process(line)

但是,有时我想跳过文件中的一些行,然后从那里继续。我不会提前知道行数,因为它取决于代码中的计算。所以我希望它像

for line in fin:
    x = process(line)
    if (x == 23):
        skip back xxx lines and continue

你怎么能在python中做到这一点?

例如,这可以用 mmap 完成吗?该文件很大,所以我不想将整个内容存储在内存中。

4

3 回答 3

1

尝试类似的东西

lines = fin.readlines()
i = 0
while i < len(lines):
    x = process(lines[i])
    if x == 23:
        i -= num_lines
    else:
        i += 1
于 2013-07-28T19:23:57.887 回答
1

我建议使用文件对象上的 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 已经为您做的事情。

于 2013-07-28T20:13:54.023 回答
0

另一种方法:

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.

于 2013-07-28T19:42:30.300 回答