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)
当你这样做
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)