我有一个文本文件,其中每个ID行以>
开头,下一行是一系列字符。并且字符序列之后的下一行将是以>
开头的另一个ID行。但在其中一些,而不是序列,我有“Sequence unavailable”
。 ID行之后的序列可以是一行或多行。
像这个例子:
>ENSG00000173153|ENST00000000442|64073050;64074640|64073208;64074651
AAGCAGCCGGCGGCGCCGCCGAGTGAGGGGACGCGGCGCGGTGGGGCGGCGCGGCCCGAGGAGGCGGCGGAGGAGGGGCCGCCCGCGGCCCCCGGCTCACTCCGGCACTCCGGGCCGCTC
>ENSG00000004139|ENST00000003834
Sequence unavailable
我想用“Sequence unavailable”
过滤掉这些ID。输出应如下所示:
输出:
>ENSG00000173153|ENST00000000442|64073050;64074640|64073208;64074651
AAGCAGCCGGCGGCGCCGCCGAGTGAGGGGACGCGGCGCGGTGGGGCGGCGCGGCCCGAGGAGGCGGCGGAGGAGGGGCCGCCCGCGGCCCCCGGCTCACTCCGGCACTCCGGGCCGCTC
你知道如何在python中做到这一点吗?
答案 0 :(得分:6)
与其他答案不同,我强烈建议不要手动解析FASTA格式。这不是太难,但是陷阱,而且完全没有必要,因为存在有效且经过良好测试的实现:
使用BioPython中的Bio.SeqIO
;例如:
new
请注意from Bio import SeqIO
for record in SeqIO.parse(filename, 'fasta'):
if record.seq != 'Sequenceunavailable':
SeqIO.write(record, outfile, 'fasta')
中缺少的空格:读取FASTA格式的序列将省略空格。
答案 1 :(得分:1)
这个怎么样:
with open(filename, 'r+') as f:
data = f.read()
data = data.split('>')
result = ['>{}'.format(item) for item in data if item and 'Sequence unavailable' not in item]
f.seek(0)
for line in result:
f.write(line)
答案 2 :(得分:0)
def main():
filename = open('text.txt', 'rU').readlines()
filterFile(filename)
def filterFile(SequenceFile):
outfile = open('outfile', 'w')
for line in SequenceFile:
if line.startswith('>'):
sequence = line.next()
if sequence.startswith('Sequence unavailable'):
//nothing should happen I suppose?
else:
outfile.write(line + "\n" + sequence + "\n")
main()
我很遗憾无法立即测试此代码,但我从头开始做到了这一点!请测试它,让我知道结果是什么,所以我可以调整代码:-)
答案 3 :(得分:-2)
所以我不知道这些文件会有多大,以防万一,我没有将文件映射到内存中这样做:
with open(filename) as fh:
with open(filename+'.new', 'w+') as fh_new:
for idline, geneseq in zip(*[iter(fh)] * 2):
if geneseq.strip() != 'Sequence unavailable':
fh_new.write(idline)
fh_new.write(geneseq)
它的工作原理是创建一个新文件,然后zip文件可以读取文件的两行,idline
将是第一部分,geneseq
是第二部分。< / p>
此解决方案在计算机电源方面应相对便宜,但会创建额外的输出文件。