对目录中的每个文件执行相同的命令

时间:2014-01-24 07:18:46

标签: python bioinformatics

我希望在构建python脚本时提供基本帮助,以便将每个文件放在一个目录中并在每个文件上执行相同的任务。我有大量的蛋白质文件(FASTA格式),我正在使用的程序只允许一次搜索~500个条目。因此,我需要分别为我的116个文件运行程序,使用各种选项,如“-N”和“-t 0.800”。我搜索了帮助,我知道我必须导入操作系统等,但我从未使用过这些系统命令而丢失了。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

import subprocess
for fname in list_of_files:
    r = subprocess.call(('your_command_here', '-N', '-t', '0.800', fname))

subprocess.call将运行您的命令,等待它完成并返回退出代码(上面称为r)。

subprocess非常强大。您可以阅读更多相关信息here

更新:我从问题中假设你有一个文件列表。如果不这样做,很容易获得一个列表。例如,如果您的文件都有扩展名.blah,请使用:

from glob import glob
list_of_files = glob('*.blah')

python模块glob接受所有通常的shell样式通配符。

答案 1 :(得分:0)

或者只是使用一些shell命令(下面假设bash)。我通常首先使用echo来确保一切都是无害的。在示例中,文件名被回显,另外还有一个具有不同后缀的新文件名(通过剥离.blah后缀并添加.result)。这对于合理地分组和关联结果非常有用。稍后您将使用$f上运行的内容替换echo命令,并将结果存储在$f{%.blah}.result中。

for f in *.blah; do
  echo $f ${f%.blah}.result
done

在一条线上; for f in *.c; do echo $f ${f%.blah}.result; done。 当然可以在上面使用重定向,例如

command $f > ${f%.blah}.result

shell是一个非常自然的环境来操纵这样的文件。您可以将命令存储在shell脚本中,作为记录工作流的方法。别忘了使用

set -e
set -o pipefail

以便脚本退出错误而不是浮躁。可以捕获此类错误并运行清理代码,通知或您可能需要的任何其他内容。

相关问题