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

Python:file.readline()跳过文件上的前一行,python,Python,我想恢复文件中包含的这四行标记错误: ERROR Blablabalbalablabalbalablabalbalablabalbalablabalbalablabalbala ERROR Tototototototototototototototototototototototototototototototot ERROR Hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihi hi

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

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

ERROR    Tototototototototototototototototototototototototototototototot

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

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

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

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

ERROR    Blablabalbalablabalbalablabalbalablabalbalablabalbalablabalbala

ERROR    Tototototototototototototototototototototototototototototototot

INFO     tik tok

ERROR    Hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihi
         hihihihihihihihihihihihihihihihihi

WARNING  bip bup

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

ERROR    Blablabalbalablabalbalablabalbalablabalbalablabalbalablabalbala

ERROR    Tototototototototototototototototototototototototototototototot

ERROR    Hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihi
         hihihihihihihihihihihihihihihihihi


您可能应该在中使用str.startswith(“”)而不是
——如果检测到以“ERROR”开头的行,您可能希望将bool标志设置为True,并且仅当您的行不以“ERROR”或“”开头时才将其设置为False。若要获得帮助,请尝试制定一个。非常感谢您的帮助!我认为问题来自主函数,当我阅读我的文件并调用此函数“getErrorWarningInfo()”来分析每一行时。``def parse_file(f):对于f中的行:if(line.startswith(“ERROR”)):error,line=self.getErrorWarningInfo(f,line,“error”)[…]“``光标在主函数中向前移动,当调用此函数时,它会继续向前移动。如果是这样的话,你有办法解决此问题吗?嗨@Nonna,你能编辑你的问题以更好地了解问题吗?我以为问题是获取整个日志,因为它跨越多行。嗨@propa”buzz!感谢您的帮助!我认为问题来自主函数,当我逐行(带循环)读取文件并调用此函数“getErrorWarningInfo()”来分析每一行:光标(行号)在主函数中向前移动,当调用此函数时,它会继续向前移动。我想这就是它跳过第二个错误的原因,你不这么认为吗?我希望你能理解我试图解释的内容。@Nouna你可能称之为readline()然后两次。第一次将行传递给函数,然后在函数中传递。我不确定。在读取文件的位置共享主函数或至少部分主函数。@Nonna,我已尝试执行您的操作,但编译器出现以下错误:nextline=file.readline()ValueError:混合使用迭代和读取方法会丢失数据。我认为您最好使用文件模块提供的方法,而不是自己循环。请参阅我给您的示例。我的建议是先组织行,然后进行筛选,然后执行任何您想要的操作。

    # 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

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

[...]