Python:file.readline()跳过文件上的前一行

2024-06-26 14:34:58 发布

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

我想恢复文件中包含的这四行标记错误:

ERROR    Blablabalbalablabalbalablabalbalablabalbalablabalbalablabalbala
ERROR    Tototototototototototototototototototototototototototototototot
ERROR    Hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihi
         hihihihihihihihihihihihihihihihihi
ERROR    Lalalalalalalalala
    def getErrorWarningInfo(self, file, line, tag):
        msg = line.strip(tag)
        while True:
            nextline = file.readline()
            if ('         ' in nextline):
                msg += "\n"+nextline.strip()
            break
        return [self.id, tag, msg] ,line

我只恢复了3个错误,包括一个包含两行的错误,但我无法获得此错误之前的行:

ERROR    Tototototototototototototototototototototototototototototototot

当我在函数中删除file.readline()行时,我恢复4错误,但只恢复有两行的错误的第一行


Tags: 文件标记selfreadlinetag错误linemsg
3条回答

这里有一个原型来解决您的问题。如果你喜欢的话,你可以根据需要调整它。 我已经编辑了一个日志文件来包含信息和警告

ERROR    Blablabalbalablabalbalablabalbalablabalbalablabalbalablabalbala
ERROR    Tototototototototototototototototototototototototototototototot
INFO     tik tok
ERROR    Hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihi
         hihihihihihihihihihihihihihihihihi
WARNING  bip bup
ERROR    Lalalalalalalalala

    # types of tags you can encounter in log
    TAGS = ["ERROR", "INFO", "WARNING"]
    LOG = "./LOG"
    with open(LOG) as log:
        lines = []
        # you want to keep previous line in case next line is continuation of it
        prev_line = ""
        for line in log.readlines():
            # Check if line contains any tags
            if any(map(line.__contains__, TAGS)):
                if prev_line:
                    # If we already have a previous line, we can add it to the list. 
                    # The current line also contains a tag
                    lines.append(prev_line)
                # Current line becomes previous
                prev_line = line
                continue
            # If there is no tag in the line, it most be continuation of previous.
            prev_line += line
    
    # Check that all lines concatenated correctly
    for line in lines:
        print line
    
    print("============ Filtering logs  =============\n")
    # Now you can filter your lines by log tags
    def get_errors(lines):
        return [line for line in lines if "ERROR" in line]
    
    # Only ERROR logs 
    for line in get_errors(lines):
        print line

输出

ERROR    Blablabalbalablabalbalablabalbalablabalbalablabalbalablabalbala

ERROR    Tototototototototototototototototototototototototototototototot

INFO     tik tok

ERROR    Hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihi
         hihihihihihihihihihihihihihihihihi

WARNING  bip bup

============ Filtering logs  =============

ERROR    Blablabalbalablabalbalablabalbalablabalbalablabalbalablabalbala

ERROR    Tototototototototototototototototototototototototototototototot

ERROR    Hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihi
         hihihihihihihihihihihihihihihihihi

为什么不使用file.read().split('ERROR')然后删除空白?(:

def parse_file(self):
        for file in self.prt_files:
            with open(os.path.join(self.path, file), "r") as f:
                try:
                    for line in f:
                        if (line.startswith("ERROR")):
                            error, line = self.getErrorWarningInfo(f, line, "ERROR")

[...]

相关问题 更多 >