搜索文件中的行并为用户提供灵活的contex

2024-04-26 18:58:47 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题的简短版本是:当您使用文本编辑器打开一个文件并搜索一个术语时,您可以在找到该术语后,在显示灵活上下文的文件中四处移动。因此,作为一个直接的例子,如果你有一个日志文件,你可以用更少的时间打开它mylog.log日志搜索/莎莉。这将带您到日志文件中第一个出现的'SALLY'。然后,使用普通的导航键(上下箭头键、pg up/dwn等),您可以看到单词“SALLY”出现前后发生了什么。我想利用一个工具来实现同样的行为,但我所研究的工具似乎都不太正确。目前看来,唯一的选择是编写自己的方法来实现这一点,但这肯定是不对的。你知道吗

这个的长版本问题:我有一堆日志文件散落一地。在我的正常工作流程中,有一部分涉及到搜索这些日志文件中的值,并从这些值周围的上下文中获取信息(值得注意的是,我不能假设上下文在一组特定的行中,在看到它之前我也不知道重要的上下文是什么。)手动到处去获取这些日志文件是非常重要的总的来说,我想告诉我的代码'寻找萨利'的代码应该给我一个地方的名单(从一个已知的地方,日志文件驻留列表)在哪里'萨利'出现。然后我选择我想要的日志文件,它会打开到第一个出现的'SALLY',并从该点开始在文件中导航。你知道吗

我知道如何做到这一点,事实上,我可以并已经实现了除了最后一点的一切。使用基本IO操作,我可以:

  • 查找并访问所有可能的日志文件
  • 查找包含“SALLY”的日志文件
  • 为用户提供一个包含所有日志文件的列表,其中包含“SALLY”
  • 给定选定的日志文件,显示包含“SALLY”的行

我不能做的是找出如何让用户能够顺利地浏览日志文件。允许他们在文件中上下移动,以便查看上下文。我可以,并且已经调用了“less”(假设它在*nix系统上)并使用了它的搜索行为,但这并不是我想要的行为。我想用Python来完成这一切。你知道吗

我已经研究了弹性搜索(这似乎远远超出了我想要的),几个日志解析库(解析日志是非常直接的),并试图找到其他解决类似问题的方法。我一直找不到有类似问题的人,更不用说解决方案了,考虑到python社区,这似乎不太可能。你知道吗

我目前正在考虑实现某种自定义文件查看器。这看起来很傻。我可以利用什么来实现这种功能?你知道吗


Tags: 文件工具方法代码用户版本利用列表
1条回答
网友
1楼 · 发布于 2024-04-26 18:58:47

所以,在玩了一会儿之后,我发现了一些对我很有用的东西,希望它也能对你有用。基本思想是,我们有某种迭代器(不是真正的迭代器,但因为我缺乏想象力,所以我称之为迭代器),它跟踪您正在查看的范围并返回您正在查看的当前部分。你知道吗

这只是一个快速和肮脏的解决办法,但我希望它做的工作

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”你下一行。问题是,之后还必须按回车键。在python中查找getch()的实现here

相关问题 更多 >