Python 从当前行读取文件

0 投票
2 回答
2962 浏览
提问于 2025-04-17 16:17

我在用Python处理一个追踪文件时遇到一个问题,这个文件有十亿行数据。

我想做的是,程序需要在文件中找到一行特定的内容(比如说是第x行),然后从这一行开始,再去找另一个符号。如果找到了这个符号,就从第x行重新开始继续搜索下一个。

我现在的做法是这样的,但问题是每次都需要重新打开文件,从头开始读,这样才能找到匹配的内容(也就是行号大于x,并且包含我想要的符号)。对于这么大的追踪文件,这样处理起来太慢了。

1.

    for line in file.readlines()
      i++ #update the line number
      if i > x:
          if (line.find()):

或者:

   for i, line in enumerate(open(file)):
      if i > x:
          if ....

有没有人能给我一些更好的建议呢?

谢谢

2 个回答

0

我建议你使用随机访问,并记录下每一行的起始位置。可以这样做:

index = []

fh = open(gash.txt)

for line in fh:
    if target in line:
        index.append(fh.tell() - len(line))

然后,当你想要回忆起内容时,可以用 fh.seek(index[n]) 来定位。

这里有几个需要注意的地方:

  1. 要注意,索引位置和行号是不一样的。如果你需要行号,可以考虑使用字典,把行号当作键来存储。

  2. 在Windows系统上,你需要把文件位置调整为 -1。这是因为"\r"这个字符被去掉了,所以在 len(line) 中看不到它。

2

如果文件的内容是稳定的,你可以使用 fileobj.tell() 来记住你在文件中的位置。下次想要回到这个位置时,可以用 fileobj.seek(pos) 来返回到之前的位置。

不过,这个方法只适用于你没有把文件对象当作迭代器使用的情况(也就是说,不要用 for line in fileobjectnext(fileobject)),因为这样会使用一个提前读取的缓冲区,这样就无法准确知道你的位置了。

相反,你可以使用:

for line in iter(fileobj.readline, ''):

这样你仍然可以在迭代的情况下使用 fileobj

撰写回答