我想从目录及其子目录中获取文件列表。从生成的列表中。我想使用subprocess
为每个文件运行Java程序,并将stdout写入单个文件。我该怎么做?
import os
myListOfFiles=[]
for root, dirs, files in os.walk("/home/documents/", topdown=False):
for name in files:
#print(os.path.join(root, name))
myListOfFiles.append(os.path.join(root, name))
print myListOfFiles
p = subprocess.Popen('Java -jar avro-tool-1.8.1.jar, '- o report $filename', stdout=subprocess.PIPE)
答案 0 :(得分:0)
首先,我不会回答第一部分(目录扫描),因为您的方法有效(即使一些评论表明更优雅的列表理解解决方案)
对于subprocess
部分,你还没有,所以让我回答一下。
你必须在一个字符串中传递你的命令,而不是两个,或者在列表中更好,所以如果文件名中包含空格/奇怪的字符,subprocess
将用引号保护命令
然后,打开一个用于编写的日志文件,并在循环中运行Popen
命令,将p.stdout
写入打开的文件:
with open("the_log","w") as logfile:
for inputFile in myListOfFiles:
p = subprocess.Popen(["java","-jar","avro-tool-1.8.1.jar","repair","-o","report",inputFile],stdout=subprocess.PIPE)
logfile.write(p.stdout.read())
p.wait()
请注意,标准错误不会写入输出文件,除非您将stderr=subprocess.STDOUT
作为额外参数传递。
当然,您可以避免首先扫描所有文件并将它们放入列表中,然后执行上面的第二个循环。您可以在subprocess.Popen
循环中合并os.walk
调用,如下所示:
import os,subprocess
with open("the_log","w") as logfile:
for root, dirs, files in os.walk("/home/documents/", topdown=False):
for name in files:
inputFile = os.path.join(root, name)
p = subprocess.Popen(["java","-jar","avro-tool-1.8.1.jar","repair","-o","report",inputFile],stdout=subprocess.PIPE)
logfile.write(p.stdout.read())
p.wait()