我有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")?目前,我的输出只是一个文本文件,每个条目相邻,子进程命令只将每个文件名打印到终端,并声明没有找到这样的文件:
grep: or 23900789. file :没有这样的文件或目录
发布于 2016-04-30 18:16:56
尝试下面的代码,它应该适用于您的示例。它将写入文件名加上一个制表符分隔符和序列数(即>
字符)。使用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')
https://stackoverflow.com/questions/36841505
复制相似问题