.json日志文件的Python编程

.json日志文件的Python编程,python,python-3.x,Python,Python 3.x,我想在long.json loggly文件中搜索特定字符串,包括其行号,还想在搜索行的上方和下方打印5行。你能帮我吗 它总是返回“未找到”。 在这之后,我现在只得到下面所示程序的一些输出。 以open('logg.json','r')作为f: 对于ln,枚举(f)中的行: 如果行中出现“error CRASHLOG”: i=ln-25 对于i in(ln-25,ln+25): l=linecache.getline('logg.json',i) i+=1 打印(ln,l) 打印(“下一个错误”)

我想在long.json loggly文件中搜索特定字符串,包括其行号,还想在搜索行的上方和下方打印5行。你能帮我吗

它总是返回“未找到”。 在这之后,我现在只得到下面所示程序的一些输出。 以open('logg.json','r')作为f: 对于ln,枚举(f)中的行: 如果行中出现“error CRASHLOG”: i=ln-25 对于i in(ln-25,ln+25): l=linecache.getline('logg.json',i) i+=1 打印(ln,l) 打印(“下一个错误”)

文件。readlines()
返回行列表。行不包含换行符(
\n

您需要指定换行符以匹配该行:

ln = data.index("error CRASHLOG\n")
如果要查找包含目标字符串的行,则需要迭代这些行:

with open('logg.json', 'r') as f:
    for ln, line in enumerate(f):
        if "error CRASHLOG" in line:
            # You now know the line index (`ln`)
            # Print above/below 5 lines here.
            break
    else:
        print("Not Found")
顺便说一句,使用
grep(1)
,这种工作很容易完成:

更新

以下是更完整的代码:

from collections import deque
from itertools import islice, chain
import sys

with open('logg.json', 'r') as f:
    last_lines = deque(maxlen=5) # contains the last (up to) 5 lines.
    for ln, line in enumerate(f):
        if "error CRASHLOG" in line:
            sys.stdout.writelines(chain(last_lines, [line], islice(f, 5)))
        last_lines.append(line)
    else:
        print("Not Found")

我确信它实际上返回“未找到”,但我把它归因于焦虑引起的欢呼

数据
是一个列表。关于
list
type()的文档说明
list.index(x)
返回“列表中第一个值为x的项的索引。如果没有这样的项,则为错误。”

因此,将报告的唯一行是那些只包含您指定的字符串而不包含其他字符的行。正如falsetru在她/他的回答中指出的,如果日志行上没有其他信息,那么您必须包括新行,以便进行比较
readlines()
确保新行位于它返回的列表中的每一行的末尾(即使在Windows系统上,只要您以文本模式打开文件,这是默认设置)。没有这一点,就没有比赛的机会


如果行中包含其他信息,那么更好的测试可能确实是按照她/他建议的那样使用字符串中的
x
,但我怀疑您可能有兴趣了解它比简单的相等性测试需要多少处理。我也这么想,但这不是我的问题…

thnx@falsetru..事实上我是编程新手。现在我已经到了这里,但我没有得到任何输出。这就是我到目前为止提出的导入sys>>>导入json>>>,使用open('logg.json','r')作为f:lines=f。对于ln,read(),line in enumerate(f):if“error CRASHLOG”行内:对于行内[ln-5:ln+5]:print(line)pass print(“下一个错误-”)break else:print(“未发现错误”)@user3363920,文件对象具有执行读写操作的当前位置。一旦你读或写了那个职位,你就要提前。您需要使用
seek
方法重新打开文件或更改位置。@user3363920,或者,您可以保留最后5行,并在找到匹配项时使用。@user3363920,我对答案进行了修改,以包含更完整的代码。把它检查出来。
from collections import deque
from itertools import islice, chain
import sys

with open('logg.json', 'r') as f:
    last_lines = deque(maxlen=5) # contains the last (up to) 5 lines.
    for ln, line in enumerate(f):
        if "error CRASHLOG" in line:
            sys.stdout.writelines(chain(last_lines, [line], islice(f, 5)))
        last_lines.append(line)
    else:
        print("Not Found")