grep:写入错误:使用子进程断开管道

Jiy*_*ssa 2 python grep subprocess

我得到了几个grep:当我运行这段代码时写错误.我错过了什么?

这只是其中的一部分:

     while d <= datetime.datetime(year, month, daysInMonth[month]):
        day = d.strftime("%Y%m%d")
        print day
        results = [day]
        first=subprocess.Popen("grep -Eliw 'Algeria|Bahrain' "+ monthDir +"/"+day+"*.txt | grep -Eliw 'Protest|protesters' "+ monthDir +"/"+day+"*.txt", shell=True, stdout=subprocess.PIPE, )
        output1=first.communicate()[0]
        d += delta
        day = d.strftime("%Y%m%d")
        second=subprocess.Popen("grep -Eliw 'Algeria|Bahrain' "+ monthDir +"/"+day+"*.txt | grep -Eliw 'Protest|protesters' "+ monthDir +"/"+day+"*.txt", shell=True,  stdout=subprocess.PIPE, )
        output2=second.communicate()[0]
        articleList = (output1.split('\n'))
        articleList2 = (output2.split('\n'))
        results.append( len(articleList)+len(articleList2))
        w.writerow(tuple(results))
        d += delta
Run Code Online (Sandbox Code Playgroud)

nne*_*neo 6

当你这样做

A | B
Run Code Online (Sandbox Code Playgroud)

在shell中,进程A的输出作为输入通过管道传输到进程B. 如果在读取所有进程A的输出之前进程B关闭(例如因为它找到了它正在查找的内容,这是该-l选项的功能),那么进程A可能会抱怨其输出管道过早关闭.

这些错误基本上是无害的,您可以通过stderr在子进程中重定向来解决这些错误/dev/null.

但是,更好的方法可能只是使用Python强大的正则表达式功能来读取文件:

def fileContains(fn, pat):
    with open(file) as f:
        for line in f:
            if re.search(pat, line):
                return True
    return False

first = []
for file in glob.glob(monthDir +"/"+day+"*.txt"):
    if fileContains(file, 'Algeria|Bahrain') and fileContains(file, 'Protest|protesters'):
        file.append(first)
Run Code Online (Sandbox Code Playgroud)