.json日志文件的Python编程

2024-04-20 08:38:34 发布

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

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

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


Tags: 文件字符串in程序json错误errorlong
2条回答

file.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)完成:

grep -C 5 'error CRASHLOG' logg.json || echo 'Not Found'

更新

下面是更完整的代码:

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")

我肯定它实际上返回“未找到”,但我把它归结为焦虑引起的叫喊。你知道吗

data是一个列表。关于list类型(http://docs.python.org/2/tutorial/datastructures.html)的文档说明list.index(x)返回“值为x的第一个项的列表中的索引。如果没有这样的项,则是错误的。”

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

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

相关问题 更多 >