2016-08-12 2 views
0

Ich spiele mit Python herum und ich versuche, eine Möglichkeit zu finden, eine Textdatei für ein bestimmtes Wort innerhalb eines Zeitbereichs zu suchen. Die Datei hat Zeitstempel, aber da die Datei eine Textdatei ist, ist alles eine Zeichenkette.Suche Textdatei für einen Zeitbereich - Python

Textdatei enthält die folgenden:

17:14:26.442 words words words words words 

17:15:32.533 words words words words words 

17:16:26.442 words words words words words 

17:17:32.533 words words words words words 

17:18:26.442 words words words words words 

17:19:32.533 words words words words words 

17:20:26.442 words words words words words 

17:21:32.533 words words words words words 

Was will ich für ein Wort in einem Zeitrahmen ist die Suche tun und nur zurück, dass die Linie, das Wort hat zwischen 17: 17: 32,533 und 17.20 : 26.442. Da es sich jedoch um ein Textdokument handelt und alles eine Zeichenfolge ist, kann ich die Bereichsoption nicht verwenden. Hat jemand Vorschläge, wie ich das machen kann?

+0

Ist '17: 17: 32.533' ein Zeitstempel? Was bedeutet es? –

+0

müssen Sie es nur einmal pro Datei oder viele Male tun? und möchten Sie eine Wortsuche oder Teilstringsuche durchführen? –

+0

Wenn Sie eine Menge Zeit haben, um die Datei zu überprüfen, sollten Sie die Daten nach Zeit sortieren und dann bisect verwenden, um Log n Lookups –

Antwort

1

Verwenden Sie das datetime Modul zu analysieren und die Zeitstempel Strings datetime Objekt zu konvertieren und dann können Sie den Vergleich, um nur die Zeilen überprüfen verwenden, die in diesem Zeitbereich fallen.

from datetime import datetime as dt 

start = dt.strptime('17:17:32.533','%H:%M:%S.%f') 
end = dt.strptime('17:20:26.442','%H:%M:%S.%f') 
word_to_search = 'word' 
with open('sample.txt', 'r') as f: 
    for line in f: 
     ts=dt.strptime(line.split()[0],'%H:%M:%S.%f') 
     if ts>start and ts<end: 
      if word_to_search in line: 
       print line 
+0

naive Frage: Warum nicht 'time.strptime' verwenden? –

+0

Ich denke, es funktioniert nicht, wie ich die erste Antwort auf diese Frage http://stackoverflow.com/questions/698223/how-can-i-parse-a-time-string-containing-milliseconds-in-it lesen -mit-python – Wajahat

+0

Eigentlich könnte es nur funktionieren, die 'struct_time' darf keine Mikrosekunden enthalten, aber wenn es keine doppelten Zeitstempel gibt (die Millisekunden entfernen), dann funktioniert es gut. – Wajahat

0

Wenn die Zeitstempel genau in dem Format sind Sie beschreiben (HH: MM: SS.mss), dann können Sie direkt vergleichen:

start = '17:17:32.533' 
end = '17:20:26.442' 
with open(filename, 'r') as f: 
    for line in f: 
     if line[:12] >= start and line[:12] <= end: 
      print(line) 

Wenn dies nicht funktioniert, weil z.B. 01: 01: 01.000 wird als 1: 1: 1.0 ausgegeben, Sie müssen zuerst den Zeitstempel analysieren. Zum Beispiel:

import datetime 
start = datetime.time(17, 17, 32, 533) 
end = datetime.time(17, 20, 26, 442) 
with open(filename, 'r') as f: 
    for line in f: 
     timestamp, words = line.split(None, 1) 
     time = datetime.strptime(timestamp, "%H:%M:%S.%f").time() 
     if time >= start and time <= end: 
      print(words) 
+0

Split dauert keine Keyword Args, Sie wollen 'line.split (None, 1)' –

+0

Ah, ja, tut mir leid, falsche Python-Version. In Python3 tut es das. –

+0

Danke Tim Fuchs, ich werde testen und damit herumspielen und hier posten was ich finde. Ich weiß Ihre ausführliche und schnelle Antwort zu schätzen! Ich bin auf Python Version 2.7 – user6534872

Verwandte Themen