【问题标题】:Pulling out only fasta sequences python只提取fasta序列python
【发布时间】:2016-04-30 00:33:19
【问题描述】:

我想读入一个大文件,其中包含 fasta 序列(1 个标题和标题下方的 1 行序列)以及行之间的其他随机垃圾和无组织间距。

我想读取每一行,如果一行以“>”符号开头,这是 fasta 序列标题的开头,然后将该标题与下一行一起拉出,这将是序列。

我有一个小示例数据文件要展示:

> 1
GCTAGCGCCACCatgactcccgcatttatcttgtgcatgctctt
>2
GCTAGCACCATGGAGACAGACACACTCCTGCTATGGGTACTGCTGCTCTG
>3
GCTAGCACCATGGAGACAGACACACTCCTGCTATG


Task 2: Subclone the synthesized

junk 

junk

>4
GCTAGCACCATGGAGACAGAC

我的代码:

f=open("File.fasta", "r")
fastaseq = open("OnlyFastaseq.fasta", "w")

for line in f:
    line = line.strip('\n')
    if line.startswith(">"):
        title = line.rstrip()
        seq = f.readline()
        seq = seq.rstrip()
        fastaseq.write(title+"\n"+seq+"\n")

想要的输出:

> 1
GCTAGCGCCACCatgactcccgcatttatcttgtgcatgctctt
>2
GCTAGCACCATGGAGACAGACACACTCCTGCTATGGGTACTGCTGCTCTG
>3
GCTAGCACCATGGAGACAGACACACTCCTGCTATG
>4
GCTAGCACCATGGAGACAGAC

结果包含除'>3'序列之外的大部分标题+序列,它没有拉出下一行(即序列)。

> 1
GCTAGCGCCACCatgactcccgcatttatcttgtgcatgctctt
>2
GCTAGCACCATGGAGACAGACACACTCCTGCTATGGGTACTGCTGCTCTG
>3
>4
GCTAGCACCATGGAGACAGAC

【问题讨论】:

    标签: python fasta


    【解决方案1】:

    您可以通过遍历输入并找到以> 开头的行然后从输入文件中写入该行和next 来过滤掉它们,例如:

    with open('File.fasta') as fin, open('OnlyFastaseq.fasta', 'w') as fout:
        for line in fin:
            if line.startswith('>'):
                fout.write(line)
                fout.write(next(fin))
    

    【讨论】:

    • 小警告:FASTA 序列通常分为 80 个核苷酸/氨基酸的行,因此可以有多个序列行。在这种特殊情况下,代码可以正常工作,对于较长的序列,它可能会返回部分序列。
    • @Ashafix 很有趣 - 谢谢。如果它作为一个问题出现,我相信我可以修改答案:)
    【解决方案2】:

    您可能想试试BioPython。它当然可以通过“打开”和一些解析来完成,但是 BioPython 有很多其他功能。要一次读取一个序列,您可以使用。

    from Bio import SeqIO
    fastaFile = "foo.fasta"
    handle = open(fastaFile,"r")
    for record in SeqIO.parse(handle,"fasta"):
        print record.id
    handle.close()
    

    有关详细信息,请参阅SeqIO docs

    【讨论】:

    • 我打算推荐 biopython(我很确定我以前遇到过这类问题)——我只是不确定如果文件是'还没有 fasta 格式...(即 - 它会成功忽略 OP 建议的可能在文件中的垃圾)
    • 不确定它是否会忽略垃圾。我可能会将这两个任务分开。 (1)首先解析垃圾并保存一个新的干净文件,然后(2)读取fasta序列。可以使用正则表达式轻松检查行。
    【解决方案3】:

    以下代码将提供所需的输出。它只打印以> 开头的标题和有效序列,即只打印 ATGC。

    f = open("File.fasta", "r")
    
    for line in f:
        line = line.strip('\n')
        if line.startswith(">"):
            title = line.strip()
            print(title)
        else:
            seq = line.strip().upper()
            if 0 not in [c in 'ATGC' for c in seq]:
                print(seq)
    

    【讨论】:

    • 考虑当有 3 行时会发生什么,第一行具有“>”标识符,第二行是所需的序列,第三行只是“CATG”。您的代码也会打印出第三行。它也不会打印缺少一个字母的正确行(可能会出现“ATTA”序列)。
    • FASTA 格式的规范是一个以 > 开头的标题,后跟序列行。所以第三行也应该被打印出来。感谢您指出只有核苷酸子集的可能性。我会相应地改变答案。
    猜你喜欢
    • 2017-01-28
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    相关资源
    最近更新 更多