2016-11-08 58 views
0

我想从目录及其子目录获取文件列表。从列表中生成。我想使用subprocess为每个文件运行一个Java程序,并将stdout写入单个文件。我该怎么做呢?将os.walk放入列表中并用python打印

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) 
+1

你可以发布你想要达到的命令行的一个示例(在命令,不与子)。 PS:你的子进程调用是错误的。但我需要工作指令来帮助您解决问题。 –

+0

当然,一秒让我为你得到它。 –

+0

您想知道哪些内容,如何打印列表(标题),或者如何将子流程输出写入文件(正文)? – davidism

回答

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() 
+0

这帮了我很多朋友,非常感谢。 –