首页 > 解决方案 > 如何在 Python 中解析具有更改索引的动态行的 txt 文件

问题描述

我是 Python 新手。需要解析带有动态变量(更改索引)的文本文件。

我有以下文本文件

packet1_ref_time = 13.64
packet2_ref_time = 73.68
16.11.2018 16:33:03 {Step 1 passed successfully!}
16.11.2018 16:33:06 {}
packet1_ref_time = 17.25
packet2_ref_time = 71.112
16.11.2018 16:33:03 {Step 2 Failed!}
16.11.2018 16:33:06 {}
packet1_ref_time = 13.877
packet2_ref_time = 78.366
16.11.2018 16:33:03 {Step 3 passed successfully!}
16.11.2018 16:33:06 {}

我的最终输出\另一个文本文件应该是:测试1通过测试2失败测试3通过

def main():
    file = open("Console_log_28-12-2018_02-31-55.txt","r")
    lines = file.readlines()
    file.close()

    for line in lines:
        line=line.strip()
        index = 1
        str (index)
        #if line == "Step"index"passed successfully!":
        if line.find("Step 1 passed successfully!") != -1:
           print ( line )
main()

结果如预期的那样是“28.12.2018 02:36:16 {步骤 1 成功通过!}”。它很明显,因为我正在搜索一个确切的步骤(在这种情况下为第 1 步)以及我需要它来搜索动态索引,就像我在评论中所写的那样:#if line == "Step"index"passed成功地!”:

但是我就是找不到关于如何编码的正确语法。

标签: pythonparsing

解决方案


对于查找行,您可以使用正则表达式,即re模块

for line in lines:
    if bool(re.search('Step [0-9]+ (passed successfully)|(Failed)!',line)):
        print(line)

[0-9]+表示任何自然数,而在这种情况下|表示或 或。repassed succsssfullyFailed

编辑:重新考虑您的问题后,我得出的结论re.findall会更好,请参见下面的示例

text = '''better in this case
packet1_ref_time = 13.64
packet2_ref_time = 73.68
16.11.2018 16:33:03 {Step 1 passed successfully!}
16.11.2018 16:33:06 {}
packet1_ref_time = 17.25
packet2_ref_time = 71.112
16.11.2018 16:33:03 {Step 2 Failed!}
16.11.2018 16:33:06 {}
packet1_ref_time = 13.877
packet2_ref_time = 78.366
16.11.2018 16:33:03 {Step 3 passed successfully!}
16.11.2018 16:33:06 {}'''
tests = re.findall('Step [0-9]+ passed|Step [0-9]+ Failed',text)
print(tests)

输出:

['Step 1 passed', 'Step 2 Failed', 'Step 3 passed']

请注意,为清楚起见,我只是将字符串分配给text. 您应该将返回的值分配.read()给您的变量。


推荐阅读