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

:あなたはこのようなあなたのos.walkループでsubprocess.Popenコールをマージすることができます。 PS:あなたのサブプロセス呼び出しが間違っています。しかし、私はそれを修正するのに役立つ作業コマンドが必要です。 –

+0

いいこと、1秒私はあなたのためにそれを手に入れましょう。 –

+0

あなたはどのようにリスト(タイトル)を印刷するか、またはサブプロセスの出力をファイル(本体)に書き込む方法を知りたいですか? – davidism

答えて

0

まず、私は、最初の部分(ディレクトリスキャン)(いくつかのコメントは、よりエレガントなリスト内包表記のソリューションを提案していても)あなたのアプローチが動作するためsubprocess部分について

、あなた」に応答しません私はそれについて答えさせてください。

コマンドを1つの文字列で渡す必要があります.2つではなく、さらにはそれよりも優れているため、ファイル名にスペースや奇妙な文字が含まれる場合は、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を渡します。

もちろん、最初にすべてのファイルをスキャンしてリストに入れてから、上記のように2番目のループを実行するのを避けることができます。あなたは(コマンドではなく、サブプロセスで)達成したいコマンドラインの例を投稿することができます

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

これは、私は多くの仲間を助けてくれました、ありがとうございました。 –

関連する問題