2016-11-24 75 views
1

我想在Python才能执行此命令Python的调用grep的失败

grep keyMessage logFile.log > keyMessageFile.log 

这就是我现在做

from subprocess import call 

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

,但我不知道如何添加> keyMessageFile.log部分

顺便说一下,我使用grep的原因是因为它比使用读文件快得多,然后比较字符串,然后写文件

#UPDATE 有较慢Python代码写到

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

为什么从'python'调用'grep'? – cdarke

+0

@MichaelMao您的更新代码将打开并关闭每行的输出文件,该文件仍然很慢。 – AKX

回答

4

,最简单的方式做到这一点(合理的安全太)是:

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

但是除非你真的需要的grep正则表达式匹配能力,和你最终读程序keyMessageFile.log反正,我不牛逼认为以下是不合理的慢:

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

“*除非你确实需要grep *的正则表达式匹配功能” - python的正则表达式能力有什么问题? – cdarke

+0

对不起,我不明白你给的第二个样本。该函数名为read_matching_lines或read_matching_files,什么是matching_line – MichaelMao

+0

我明白了,第二个示例比我的Python代码更快。谢谢 – MichaelMao

4

subprocess.call具有参数stdout。传递打开的文件以写入文件。

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

subprocess.call是旧的API,你应该使用subprocess.run代替。

0

对于我这样工作的:

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