gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:18:56 25 4
gpt4 key购买 nike

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

这个问题的长版本:我有一堆日志文件散落在各处。我的正常工作流程的一部分涉及在这些日志文件中搜索值并从这些值周围的上下文中获取信息(值得注意的是,我不能假设上下文位于特定的行集中,也不知道,直到我看到重要的上下文是什么。)手动到处获取这些日志文件是很恶心的,我想告诉我的代码“寻找 SALLY”,代码应该给我一个位置列表(来自日志文件所在的已知位置列表) )其中出现“SALLY”。然后,我选择所需的日志文件,它会打开到第一次出现的“SALLY”,并且能够从该点开始在文件中导航。

我知道如何完成大部分工作,事实上,我可以并且已经实现了除了最后一点之外的所有内容。使用基本的 IO 操作我可以:

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

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

我看过Elastic Search(这似乎远远超出了我想要的),几个日志解析库(解析日志非常简单),只是试图找到其他类似问题的解决方案。我一直找不到任何有类似问题的人,更不用说解决方案了,考虑到 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 键。看here python 中 getch() 的实现

关于python - 搜索文件中的行并为用户提供灵活的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24515100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com