使用python subprocess.call将fasta序列的计数写入文件

时间:2016-04-25 13:06:37

标签: python linux bash subprocess fasta

我有超过14000个fasta文件,我想只保留包含5个序列的文件。我知道我可以使用以下bash命令来获取单个fasta文件中的序列数:

grep -c "^>" filename.fasta

所以我的方法是将每个文件中的文件名和序列数写入文本文件,然后我可以使用它来仅隔离我想要的序列。要在这么多文件上运行grep命令,我使用的是subprocess.call:

import subprocess
import os


with open("five_seqs.txt", "w") as f:
    for file in os.listdir("/Users/vivaksoni1/Downloads/DA_CDS/fasta_files"):
        f.write(file),
        subprocess.call(["grep", "-c", "^>", file], stdout = f)

我的部分问题是grep命令是" ^>",但是子进程要求每个参数都有自己的引号。我该如何使用" ^>"当我基本上作为一个论点进入时:"" ^>""。

另外,我必须在f.write(文件)之后添加f.write(" \ n")吗?目前我的输出只是一个文本文件,每个条目彼此相邻,而subprocess命令只是将每个文件名打印到终端,并声明没有找到这样的文件:

grep:MZ23900789.fasta:没有这样的文件或目录

1 个答案:

答案 0 :(得分:2)

尝试以下代码,它应该适用于您的示例。它将写入文件名加上制表符分隔符和序列数(即>个字符)。 使用Popencommunicate可以更好地灵活处理输出。在Ubuntu上测试过。

import subprocess
import os

fasta_dir = "/Users/vivaksoni1/Downloads/DA_CDS/fasta_files/"

with open("five_seqs.txt", "w") as f:
    for file in os.listdir(fasta_dir):
        f.write(file + '\t')
        grep = subprocess.Popen(["grep", "-c", "^>", fasta_dir + file], stdout = subprocess.PIPE)
        out, err = grep.communicate()
        f.write(out + '\n')