我有一个关于使用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 ....
任何人都可以给我一些关于更好想法的暗示吗?
由于
答案 0 :(得分:2)
如果文件稳定,请使用fileobj.tell()
记住您在文件中的位置,然后使用fileobj.seek(pos)
返回文件中的相同位置。
这只有在不将文件对象用作迭代器(无for line in fileobject)
或next(fileobject)
)时才有效,因为它使用的预读缓冲区会使确切的模糊不清位置。
相反,请使用:
for line in iter(fileobj.readline, ''):
仍然在迭代上下文中使用fileobj
。
答案 1 :(得分:0)
我建议您使用随机访问,并记录您的行开始的位置。类似的东西:
index = []
fh = open(gash.txt)
for line in fh:
if target in line:
index.append(fh.tell() - len(line))
然后,当您想要回忆内容时,请使用fh.seek(index[n])
。
一些“陷阱”:
请注意,索引位置与行号不同。如果您需要行号,那么可以使用字典,行号作为键。
在Windows上,您必须将文件位置调整为-1。这是因为“\ r”已被删除,并且未显示在len(line)
中。