我是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 ==“步骤”索引“成功通过!”:
但是我找不到关于如何编码的正确语法。
答案 0 :(得分:1)
要查找行,可以使用正则表达式,即re
模块
for line in lines:
if bool(re.search('Step [0-9]+ (passed successfully)|(Failed)!',line)):
print(line)
[0-9]+
表示任何自然数,而|
表示re
或passed 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