Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 搜索文件中的行并为用户提供灵活的上下文_Python_Logging - Fatal编程技术网

Python 搜索文件中的行并为用户提供灵活的上下文

Python 搜索文件中的行并为用户提供灵活的上下文,python,logging,Python,Logging,这个问题的简短版本是:当您使用文本编辑器打开一个文件并搜索一个术语时,您可以在找到该术语后,在显示灵活上下文的文件中四处移动。因此,作为一个直接的例子,如果你有一个日志文件,你可以用更少的mylog.Log和search/SALLY打开它。这将带您进入日志文件中第一个出现的“SALLY”。然后,使用普通导航键up和down箭头键,pg up/dwn等,您可以看到单词“SALLY”出现前后发生的情况。我想利用一个工具来实现同样的行为,但我所研究的工具似乎都不太正确。目前看来,唯一的选择似乎是编写自

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

这个问题的长版本:我有一堆分散在各地的日志文件。我的正常工作流程中有一部分涉及到搜索这些日志文件中的值,并从这些值周围的上下文中获取信息。值得注意的是,我不能假设上下文在一组特定的行中,也不知道重要的上下文是什么。手动到处获取这些日志文件是很糟糕的,我想告诉我的代码“查找SALLY”。代码应该给我一个位置列表,从已知的日志文件所在的位置列表中可以看到“SALLY”出现的位置。然后,我选择我想要的日志文件,它将打开到“SALLY”的第一个匹配项,并能够从该点在文件中导航

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

查找并访问所有可能的日志文件 查找包含“SALLY”的日志文件 为用户提供一个包含所有日志文件的列表,其中包含“SALLY” 给定选定的日志文件,显示包含“SALLY”的行 我不能做的是找出如何让用户能够顺利浏览日志文件。允许他们在文件中上下移动,以便查看上下文。我可以,而且已经,在*nix系统上调用'less',并使用它的搜索行为,但这并不是我想要的行为。我想用Python来完成这一切

我已经研究了弹性搜索,这似乎远远超出了我想要的,几个日志解析库使用这些日志非常简单,只是试图找到其他人对类似问题的解决方案。我一直找不到有类似问题的人,更不用说在python社区看来似乎不太可能找到解决方案了


我目前正在考虑实现某种自定义文件查看器。这似乎很愚蠢。我可以利用什么来实现这种功能呢?

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

这只是一个快速而肮脏的解决方案,但我希望它能起作用

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:您通常需要多少行,或者这个数字变化很大?