【问题标题】:Extract multiple sequences from fasta but with different name从 fasta 中提取多个序列但名称不同
【发布时间】:2014-02-01 08:25:21
【问题描述】:

我正在尝试根据 ID 列表从 fasta 文件中提取序列子集,到目前为止一切顺利。 我的问题是我的 ID 列表包含额外的第二列(代表序列的编码部分),我想将其保留在新的 fasta 文件中

File 1: Id list
>TCONS_00000004  654:819
>TCONS_00000006  238:367
>TCONS_00000009  956:1555

File 2: fasta file
>TCONS_00000004
AAAATAATAAACTTTGCAAAGAGCAAATTTGAAGAAGCAGTTGATATACGTCGAGAGATTTCTGCAACAG 
CGCGATTATATTACATTCAATTAATTAAAATGCAGTACAGAGACATCCACGATTTCGTCAACATACCAGG
>TCONS_00000006
AAAATAATAAACTTTGCAAAGAGCAAATTTGAAGAAGCAGTTGATATACGTCGAGAGATTTCTGCAACAG 
CGCGATTATATTACATTCAATTAATTAAAATGCAGTACAGAGACATCCACGATTTCGTCAACATACCAGG
>TCONS_00000009
AAAATAATAAACTTTGCAAAGAGCAAATTTGAAGAAGCAGTTGATATACGTCGAGAGATTTCTGCAACAG 
CGCGATTATATTACATTCAATTAATTAAAATGCAGTACAGAGACATCCACGATTTCGTCAACATACCAGG

Expected outcome:
 >TCONS_00000004 654:819
AAAATAATAAACTTTGCAAAGAGCAAATTTGAAGAAGCAGTTGATATACGTCGAGAGATTTCTGCAACAG 
CGCGATTATATTACATTCAATTAATTAAAATGCAGTACAGAGACATCCACGATTTCGTCAACATACCAGG
>TCONS_00000006 238:367
AAAATAATAAACTTTGCAAAGAGCAAATTTGAAGAAGCAGTTGATATACGTCGAGAGATTTCTGCAACAG 
CGCGATTATATTACATTCAATTAATTAAAATGCAGTACAGAGACATCCACGATTTCGTCAACATACCAGG
>TCONS_00000009 956:1555
AAAATAATAAACTTTGCAAAGAGCAAATTTGAAGAAGCAGTTGATATACGTCGAGAGATTTCTGCAACAG 
CGCGATTATATTACATTCAATTAATTAAAATGCAGTACAGAGACATCCACGATTTCGTCAACATACCAGG

我尝试使用以下 biopython 命令,但它只会从 file2 中提取而没有我需要的其他数字。

from Bio import SeqIO
id = []
for line in open("test.txt","r"):
    id.append(line.rstrip().strip('\t'))
for rec in SeqIO.parse("mymodified_transcript.fa","fasta"):
    if rec.id in id:
        print rec.format("fasta")

如何保留额外的数字并从 file2 中提取序列?或者将文件2中的名称替换为文件1中的名称? 感谢您的帮助

【问题讨论】:

    标签: python biopython


    【解决方案1】:

    我得到了解决方案。它在我的 Ubuntu 中运行良好。请试试这个:)

    from Bio import SeqIO
    temp = {}
    for line in open("test.txt","r"):
        i, c = line.strip().split()
        temp[i] = c
    
    for rec in SeqIO.parse("mymodified_transcript.fa","fasta"):
        if str('>'+rec.id) in temp.keys():
            print str('>'+rec.id), temp['>'+rec.id]
            print str(rec.seq)
    

    【讨论】:

    • 请不要使用 id,因为这确实令人困惑,而且不是一个好习惯,因为您正在使用 rec.id 并与名为 id 的同名列表/字典进行比较。此外,当您使用 list/dict 时,在比较的情况下,您会不知不觉地错过开始的 '>'。希望解决方案有所帮助!
    • 太棒了。我真的很高兴它奏效了。请接受这将是我在这个星期五晚上最大的礼物的答案:) 干杯!
    • 帮了很多忙,感谢您的建议,总是很高兴有一些,因为我刚刚开始使用 biopython,再次感谢
    • 不用担心。在过去一年左右的时间里,我没有使用 BioPython,但花了几年时间使用它,确实是一个很棒的库!没问题,伙计。干杯!
    【解决方案2】:

    为什么不使用字典而不是列表来进行 id 查找?例如

    from Bio import SeqIO
    id = {}
    for line in open("test.txt","r"):
        i, c = line.strip().split()
        id[i] = c
    for rec in SeqIO.parse("mymodified_transcript.fa","fasta"):
        if rec.id in id:
            print rec.id, id[rec.id]
            print rec.format("fasta")
    

    【讨论】:

    • 这是个好主意,我之前尝试过,但它也不起作用,我什么也没得到!
    • text.txt 包含什么?如果你提到 id 列表的文件名会发生什么?
    • text.txt是id为list的文件
    • 文件是只包含一列还是两者都包含?如果两者都是,那么代码第 6 行中的 id 是如何匹配的?
    • 我写的代码只有在我删除第二列时才有效(是的,我的文件包含两列)我不知道该怎么做!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2015-07-12
    • 1970-01-01
    相关资源
    最近更新 更多