Python 搜索文件中的行并为用户提供灵活的上下文
这个问题的简短版本是:当您使用文本编辑器打开一个文件并搜索一个术语时,您可以在找到该术语后,在显示灵活上下文的文件中四处移动。因此,作为一个直接的例子,如果你有一个日志文件,你可以用更少的mylog.Log和search/SALLY打开它。这将带您进入日志文件中第一个出现的“SALLY”。然后,使用普通导航键up和down箭头键,pg up/dwn等,您可以看到单词“SALLY”出现前后发生的情况。我想利用一个工具来实现同样的行为,但我所研究的工具似乎都不太正确。目前看来,唯一的选择似乎是编写自己的方法来实现这一点,但这肯定是不对的 这个问题的长版本:我有一堆分散在各地的日志文件。我的正常工作流程中有一部分涉及到搜索这些日志文件中的值,并从这些值周围的上下文中获取信息。值得注意的是,我不能假设上下文在一组特定的行中,也不知道重要的上下文是什么。手动到处获取这些日志文件是很糟糕的,我想告诉我的代码“查找SALLY”。代码应该给我一个位置列表,从已知的日志文件所在的位置列表中可以看到“SALLY”出现的位置。然后,我选择我想要的日志文件,它将打开到“SALLY”的第一个匹配项,并能够从该点在文件中导航 我知道如何做到这一点,事实上,除了最后一点,我可以并且已经实现了所有的事情。使用基本IO操作,我可以: 查找并访问所有可能的日志文件 查找包含“SALLY”的日志文件 为用户提供一个包含所有日志文件的列表,其中包含“SALLY” 给定选定的日志文件,显示包含“SALLY”的行 我不能做的是找出如何让用户能够顺利浏览日志文件。允许他们在文件中上下移动,以便查看上下文。我可以,而且已经,在*nix系统上调用'less',并使用它的搜索行为,但这并不是我想要的行为。我想用Python来完成这一切 我已经研究了弹性搜索,这似乎远远超出了我想要的,几个日志解析库使用这些日志非常简单,只是试图找到其他人对类似问题的解决方案。我一直找不到有类似问题的人,更不用说在python社区看来似乎不太可能找到解决方案了Python 搜索文件中的行并为用户提供灵活的上下文,python,logging,Python,Logging,这个问题的简短版本是:当您使用文本编辑器打开一个文件并搜索一个术语时,您可以在找到该术语后,在显示灵活上下文的文件中四处移动。因此,作为一个直接的例子,如果你有一个日志文件,你可以用更少的mylog.Log和search/SALLY打开它。这将带您进入日志文件中第一个出现的“SALLY”。然后,使用普通导航键up和down箭头键,pg up/dwn等,您可以看到单词“SALLY”出现前后发生的情况。我想利用一个工具来实现同样的行为,但我所研究的工具似乎都不太正确。目前看来,唯一的选择似乎是编写自
我目前正在考虑实现某种自定义文件查看器。这似乎很愚蠢。我可以利用什么来实现这种功能呢?所以,在玩了一会儿之后,我发现了一些对我来说非常有用的东西,希望它也能对你有用。基本思想是,我们有某种迭代器,不是真正的迭代器,但因为我缺乏想象力,我称之为迭代器,它跟踪您正在查看的范围,并返回您正在查看的当前部分 这只是一个快速而肮脏的解决方案,但我希望它能起作用
from subprocess import call
def main():
fp = open('path/to/your/file')
f = fp.readlines()
fp.close()
myIter = MyIterator(f,12)
# ^replace with the actual index the line you want to look at
print myIter.current()
cmd = raw_input()
#Input is no optimal, but this is beyond the scope of your question
while cmd != "quit":
call(["clear"])
if cmd == "u":
myIter.previous()
elif cmd == "d":
myIter.next()
for line in myIter.current():
print line
cmd = raw_input()
class MyIterator():
def __init__(self,f,index):
self.f = []
for line in f:
#Otherwise you would have a blank line between every line
self.f.append(line.replace('\n',''))
self.upper_index = index-1
self.lower_index = index
def hasNext(self):
if self.upper_index > len(self.f):
return False
else:
return True
def hasPrevious(self):
if self.lower_index <= 0:
return False
else:
return True
def next(self):
self.upper_index += 1
return self.current()
def previous(self):
self.lower_index -= 1
return self.current()
def current(self):
return self.f[self.lower_index:self.upper_index]
if __name__ == "__main__":
main()
请注意,用“u”表示上升一行,用“d”表示下降一行。问题是,之后还必须按enter键。在python中寻找getch的实现日志文件是否太大以至于无法将用户请求的文件读入内存?如果没有,为什么不让ListNumerateFile.readlines显示当前行的变量,并在用户按下/向上键时显示第+-1行?您使用命令行界面还是GUI?如果你使用GUI,哪种框架?@timgeb-这实际上是我现在正在做的事情,但感觉很笨重。我不想手动处理文件的结尾,每次重新加载数据似乎都不太理想,而且有些文件相当大,一次运行一次也没什么大不了的,或者像我现在做的那样,只加载最后几行,这不太理想。@wastl-我目前使用的是命令行界面。如果它具有我所需要的功能,我并不反对迁移到其他地方。@Nahkki:您通常需要多少行,或者这个数字变化很大?