在python中过滤一个奇怪的文本文件

时间:2017-05-30 13:48:39

标签: python bioinformatics fasta

我有一个文本文件,其中每个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中做到这一点吗?

4 个答案:

答案 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>

此解决方案在计算机电源方面应相对便宜,但会创建额外的输出文件。