2016-11-24 2 views
1

ich in Python diesen Befehl ausführen willPython Aufruf grep zum Scheitern verurteilt

grep keyMessage logFile.log > keyMessageFile.log 

Dies ist, was ich

from subprocess import call 

keyMessage= 'keyMessage' 
call(["grep", keyMessage, "logFile.log"]) 

jetzt

getan, aber ich weiß nicht, wie der > keyMessageFile.log Teil

hinzufügen

Übrigens ist der Grund, warum ich Grep verwende, weil es viel schneller ist, als gelesene Datei zu verwenden, dann Zeichenfolge zu vergleichen und dann Datei

zu schreiben 0

#Update Es ist der langsamere Python-Code I

keyMessage= 'keyMessage' 

with open('logFile.log') as f: 
    for line in f: 
     with open(keyMessage+ '.txt', 'a') as newFile: 
      if(keyMessage not in line): 
       continue 
      else: 
       newFile.write(line) 
+0

Warum 'grep' von' python' nennen? – cdarke

+0

@MichaelMao Ihr aktualisierter Code öffnet und schließt die Ausgabedatei für jede Zeile, die immer noch langsam ist. – AKX

Antwort

4

Der einfachste Weg, dies (maßen sicher auch) zu tun ist:

from subprocess import check_call 
from shlex import quote 
check_call('grep %s logFile.log > keyMessageFile.log' % quote(keyMessage), shell=True) 

Allerdings, wenn Sie wirklich die Regex Matching-Fähigkeiten von grep benötigen, und Sie am Ende keyMessageFile.log in Ihrem Programm liest sowieso, I don‘ t denke, die folgende unzumutbar langsam sein würde:

def read_matching_lines(filename, key): 
    with open(filename) as fp: 
     for line in fp: 
     if key in line: 
      yield line 

for matching_line in read_matching_lines('logFile.log', keyMessage): 
    print(matching_line) 
+0

"* es sei denn, Sie brauchen wirklich die Regex-Anpassungsfunktionen von grep *" - Was ist falsch an den Regex-Funktionen von Python? – cdarke

+0

Entschuldigung, ich verstehe nicht die zweite Probe, die Sie geben. Die Funktion heißt read_matching_lines oder read_matching_files und was ist matching_line? – MichaelMao

+0

Ich habe es und das 2. Beispiel ist vert schneller als mein Python-Code. Vielen Dank – MichaelMao

4

subprocess.call hat einen Parameter stdout schreiben. Übergeben Sie eine Datei, die zum Schreiben geöffnet wurde.

with open("keyMessageFile.log", "w") as o: 
    keyMessage= 'keyMessage' 
    call(["grep", keyMessage, "logFile.log"], stdout=o) 

subprocess.call ist die alte API, Sie subprocess.run stattdessen verwenden sollten.

0

Für mich dieses Werk:

import sys 
    os.system('grep %s logFile.log > keyMessageFile.log' % 'looking string') 
Verwandte Themen