Python,计算时间差

Python, calculating time difference

我正在解析从多个来源生成的日志并将它们合并在一起以形成一个具有以下格式的巨大日志文件;

My_testNumber: 14, JobType = testx.

ABC 2234

**SR 111**
1483529571  1   1   Wed Jan  4 11:32:51 2017    0   4
    datatype someRandomValue
SourceCode.Cpp 588

DBConnection failed

TB 132


**SR 284**
1483529572  0   1   Wed Jan  4 11:32:52 2017    5010400     4
    datatype someRandomXX
SourceCode2.cpp 455

DBConnection Success

TB 102

**SR 299**

1483529572  0   1   **Wed Jan  4 11:32:54 2017**    5010400     4
    datatype someRandomXX
SourceCode3.cpp 455

ConnectionManager Success

..... (这里有几十个SR号)

现在我正在寻找一种解析日志的聪明方法,以便它计算每个 testNumber 和 SR 编号的时间差(以秒为单位) 像 My_testNumber:14 它减去 SR 284 和 SR 111 时间(此处相差 1 秒),对于 SR 284 和 299 是 2 秒,依此类推。

您可以解析您发布的日志文件并相应地保存相应的数据。然后,您可以使用数据来获取时差。以下应该是一个不错的开始:

from itertools import combinations
from itertools import permutations # if order matters
from collections import OrderedDict
from datetime import datetime
import re


sr_numbers = []
dates = []

# Loop through the file and get the test number and times
# Save the data in a list

pattern = re.compile(r"(.*)\*{2}(.*)\*{2}(.*)")
for line in open('/Path/to/log/file'):
    if '**' in line:
        # Get the data between the asterisks
        if 'SR' in line:
            sr_numbers.append(re.sub(pattern,"\2", line.strip()))
        else:
            dates.append(datetime.strptime(re.sub(pattern,"\2", line.strip()), '%a %b  %d %H:%M:%S %Y'))
    else:
        continue

# Use hashmap container (ordered dictionary) to make it easy to get the time differences
# Using OrderedDict here to maintain the order of the order of the test number along the file
log_dict = OrderedDict((k,v) for k,v in zip(sr_numbers, dates))

# Use combinations to get the possible combinations (or permutations if order matters) of time differences
time_differences = {"{} - {}".format(*x):(log_dict[x[1]] - log_dict[x[0]]).seconds for x in combinations(log_dict, 2)}

print(time_differences)

# {'SR 284 - SR 299': 2, 'SR 111 - SR 284': 1, 'SR 111 - SR 299': 3}

编辑:

在不依赖日期前后的星号的情况下解析文件:

from itertools import combinations
from itertools import permutations # if order matters
from collections import OrderedDict
from datetime import datetime
import re


sr_numbers = []
dates = []

# Loop through the file and get the test number and times
# Save the data in a list

pattern = re.compile(r"(.*)\*{2}(.*)\*{2}(.*)")
for line in open('/Path/to/log/file'):
    if 'SR' in line:
        current_sr_number = re.sub(pattern,"\2", line.strip())
        sr_numbers.append(current_sr_number)
    elif line.strip().count(":") > 1:
        try:
            dates.append(datetime.strptime(re.split("\s{3,}",line)[2].strip("*"), '%a %b  %d %H:%M:%S %Y'))
        except IndexError:
            #print(re.split("\s{3,}",line))
            dates.append(datetime.strptime(re.split("\t+",line)[2].strip("*"), '%a %b  %d %H:%M:%S %Y'))
    else:
        continue


# Use hashmap container (ordered dictionary) to make it easy to get the time differences
# Using OrderedDict here to maintain the order of the order of the test number along the file
log_dict = OrderedDict((k,v) for k,v in zip(sr_numbers, dates))

# Use combinations to get the possible combinations (or permutations if order matters) of time differences
time_differences = {"{} - {}".format(*x):(log_dict[x[1]] - log_dict[x[0]]).seconds for x in combinations(log_dict, 2)}

print(time_differences)

# {'SR 284 - SR 299': 2, 'SR 111 - SR 284': 1, 'SR 111 - SR 299': 3}

希望这有用。