Эта функция генератора возвращает кортеж, содержащий идентификатор и разницу во временных отметках между сообщениями out и in.(Если вы хотите сделать что-то более сложное с разницей во времени, проверьте datetime.timedelta
).Обратите внимание, что это предполагает, что наши сообщения всегда появляются раньше в сообщениях.
def get_time_deltas(infile):
entries = (line.split() for line in open(INFILE, "r"))
ts = {}
for e in entries:
if len(e) == 11 and " ".join(e[2:5]) == "TMsg out: [O]":
ts[e[8]] = e[0] # store timestamp for id
elif len(e) == 10 and " ".join(e[2:5]) == "TMsg in: [A]":
in_ts, ref_id = e[0], e[9]
# Raises KeyError if out msg not seen yet. Handle if required.
out_ts = ts.pop(ref_id) # get ts for this id
yield (ref_id[1:-1], float(in_ts) - float(out_ts))
Теперь вы можете получить из него список:
>>> INFILE = 'C:/Users/kdalton/Documents/Minicomm.txt'
>>> list(get_time_deltas(INFILE))
[('123', 8.699999307282269e-05), ('1233', 0.00028700000257231295)]
Или записать его в файл:
>>> with open("out.txt", "w") as outfile:
... for id, td in get_time_deltas(INFILE):
... outfile.write("Msg %s took %f seconds\n", (id, td))
Или включите его в более сложный рабочий процесс.
Обновление:
(в ответ на просмотр фактических данных)
Попробуйте этовместо этого:
def get_time_deltas(infile):
entries = (line.split() for line in open(INFILE, "r"))
ts = {}
for e in entries:
if " ".join(e[2:5]) == "OuchMsg out: [O]":
ts[e[8]] = e[0] # store timestamp for id
elif " ".join(e[2:5]) == "OuchMsg in: [A]":
in_ts, ref_id = e[0], e[7]
out_ts = ts.pop(ref_id, None) # get ts for this id
# TODO: handle case where out_ts = None (no id found)
yield (ref_id[1:-1], float(in_ts) - float(out_ts))
INFILE = 'C:/Users/kdalton/Documents/Minicomm.txt'
print list(get_time_deltas(INFILE))
Изменения в этой версии:
- количество полей не соответствует указанному в вводном примере, размещенном в вопросе.Удалена проверка, основанная на номере записи
ordID
для in
сообщений - это та, которая соответствует refID
в out
сообщениях - используется
OuchMsg
вместо TMsg
Обновление 2
Чтобы получить среднее значение дельт:
deltas = [d for _, d in get_time_deltas(INFILE)]
average = sum(deltas) / len(deltas)
Или, если вы ранее создали список, содержащий все данные, мы можем повторно использоватьэто вместо повторного разбора файла:
data = list(get_time_deltas(INFILE))
# .. use data for something some operation ...
# calculate average using the list
average = sum(d for _, d in data) / len(data)