如何在Python中使用更改索引来解析动态行的txt文件

时间:2019-01-06 09:18:07

标签: python parsing

我是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 ==“步骤”索引“成功通过!”:

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

3 个答案:

答案 0 :(得分:1)

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

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

[0-9]+表示任何自然数,而|表示repassed succsssfully的情况,在此情况下为Failed

编辑:重新思考您的问题后,我得出结论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()返回的值分配给变量。

答案 1 :(得分:1)

outputlist = []
with open("Console_log_28-12-2018_02-31-55.txt","r") as file:
    lines = file.readlines()
    for line in lines:
        if 'passed successfully' in line:
            loc = line.find('passed')
            test, num = 'pass', line[:loc].split()[-1]
            outputlist.append((num, test))
        elif 'Failed' in line:
            loc = line.find('Failed')
            test, num = 'fail', line[:loc].split()[-1]
            outputlist.append((num, test))

print (outputlist)
#[('1', 'pass'), ('2', 'fail'), ('3', 'pass')]

说明:
test, num = 'pass', line[:loc].split()[-1]将为您获取行中满足条件的最后一个数字。这可以帮助您解释尽可能多的测试用例,只要它们被分开即可。
outputlist是一个元组列表,其中将告诉您哪些测试用例通过或失败。

因此,您可以在输出列表中进行for循环以打印出所需的语句。

for i, v in outputlist:
    print (f'Test {i} {v}ed')
#Test 1 passed
#Test 2 failed
#Test 3 passed

此外,使用with打开文件,这样您就可以不必调用f.close()with将调用dunder方法__exit__来帮助关闭文件

答案 2 :(得分:1)

您可以将字符串格式运算符与string参数一起使用,以查找功能,如下所述。可以在任何需要替换字符串的地方使用字符串格式化运算符。

    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 %d passed successfully!"%index) != -1:
           print ( line )
main()

要了解更多信息,请参阅文档https://docs.python.org/2/library/stdtypes.html#string-formatting-operations