2016-11-08 36 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

這幫了我很多朋友,非常感謝。 –