我有超过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:没有这样的文件或目录
答案 0 :(得分:2)
尝试以下代码,它应该适用于您的示例。它将写入文件名加上制表符分隔符和序列数(即>
个字符)。
使用Popen
和communicate
可以更好地灵活处理输出。在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')