2014-03-14 94 views
0

我對Python非常陌生,我正在嘗試編寫一個腳本,用於提取日誌中少數行的TimeStamps。Python:從兩行之間的日誌中提取時間戳

日誌看起來像這樣。

----------------------------------------------- 
138976 2013-12-17 18:25:58.607 superman(759) Debug: {event} TUNE: IR Signal Received: Key Code: 104 

138977 2013-12-17 18:25:58.616 mediamanager(763) Debug: {event} TUNE: Player Close Issued 

138999 2013-12-17 18:25:58.683 mediamanager(763) Debug: {event} TUNE: Player Open Issued: atsc://fr783000000.256.10 

139003 2013-12-17 18:25:58.688 mediamanager(763) Debug: {event} TUNE: Streamer Opened: atsc://fr783000000.256.10 SessionId=152 ProcessID=856 

139014 2013-12-17 18:25:58.695 halserver(628) Debug: {event} TUNE: Frontend Locked: Tuner: 1 

139030 2013-12-17 18:25:58.735 mediamanager(763) Debug: {event} TUNE: Player Play Issued: SessionId: 152 


139133 2013-12-17 18:25:59.705 httpmediaserver(824) Debug: {event} TUNE: HTTP Request Received: HEAD /mediasession?producer_id=8&type=tune_live HTTP/1.1 

139134 2013-12-17 18:25:59.757 halserver(628) Debug: {event} TUNE: New Picture Received 

139136 2013-12-17 18:25:59.757 halserver(628) Debug: {event} TUNE: Video Is Visible 
--------------------------------------- 

基本上有很少其他不必要的線以及之間。 這裏的線條很少會隨機出現,我要找的是當Tune Events出現在這個序列中時提取數據。

有人可以提供一些想法。

在此先感謝:-)

+0

嗨@dashX,我試圖改進你的文章的格式,但你可能想檢查這些連字符是否應該包含在數據中。 – Marius

+0

聽起來像是grep的工作,即'''grep -P'^ \ d + \ d {4} - \ d {2} - \ d {2} \ d {2}:\ d {2}:\ d {2}。\ d {3}'''' –

+0

那麼你期望的結果是什麼?包含'TUNE'的行的所有時間戳列表?一本字典,還應該包含行號?請更具體地... – skamsie

回答

4

我仍然不確定你在問什麼。您要麼僅收集列表中的兩個事件之間的時間戳,要麼要根據日誌文件找出兩個事件之間的時間?

import re 

with open('my_log.txt') as my_log: 
    a = [re.findall(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}', 
     line)[0] for line in my_log.readlines() if 'TUNE:' in line] 
print a 

輸出,如果你想在一個列表中的時間戳:

['2013-12-17 18:25:58.607', '2013-12-17 18:25:58.616', 
'2013-12-17 18:25:58.683', '2013-12-17 18:25:58.688', 
'2013-12-17 18:25:58.695', '2013-12-17 18:25:58.735', 
'2013-12-17 18:25:59.705', '2013-12-17 18:25:59.757', 
'2013-12-17 18:25:59.757'] 

輸出,如果你想知道的第一個和最後事件之間的時間差:

from dateutil import parser 

t_delta = parser.parse(a[-1]) - parser.parse(a[0]) 
print t_delta #0:00:01.150000 
+0

非常感謝。在這裏有一個疑問,如果'TUNE:'在行「[0]的意義是什麼,你可以請打破這個並解釋」[0]爲my_log.readlines()中的行嗎? – dashX

+0

不客氣。 're.findall()'將返回一個列表,其中包含與模式匹配的所有結果。 '[0]'表示只取出該列表中的第一個元素。如果這是你正在尋找的答案,你可以接受它。它會增加我們的聲譽,再加上它會幫助其他人知道這個問題已經解決了。 – skamsie