繁体   English   中英

将os.walk放入列表并在python中打印

[英]Put os.walk into a list and print in python

我想从目录及其子目录中获取文件列表。 从生成的列表。 我想使用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)

首先,我不会回答第一部分(目录扫描),因为您的方法可行(即使有些评论建议使用更优雅的列表理解解决方案)

对于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作为额外的参数传递,否则不会将标准错误写入输出文件。

当然,您可以避免先扫描所有文件并将它们放在列表中,然后再执行如上所述的第二循环。 您可以在os.walk循环中合并subprocess.Popen调用,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM