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")
[...]