使用python进行ClustalW格式和aligned FASTA格式转换

ClustalW格式是多序列比对程序CLUSTAL W的默认输出格式,大概是这个样子:

Aligned FASTA格式是多序列比对程序MUSCLE的默认输出格式,与一般的FASTA格式很相似,只是根据比对结果在序列中填充“-”,使所有序列长度相同,例如:

Aligned FASTA格式更便于机器阅读,而ClustalW格式是比较人性化的 ,使用者可以直观地看到相同和不同的区域。

由于MUSCLE程序的profile alignment功能需要aligned FASTA格式的输入,因此我写了以下一段简单的python代码,把ClustalW格式转换成aligned FASTA格式:

#!/usr/bin/python
#Usage: python clw2afa.py input.clw
#Default output is STDOUT, you can redirect using '>'
#You can also import it as a module, i.e. import clw2afa

import sys
import re

def clw2afa(filename):
    pat=re.compile('(\S+)\s+(\S+)')
    f=open(filename)
    header=f.readline()
    if not header.startswith('CLUSTAL') and not header.startswith('MUSCLE'):
        sys.exit("clw2afa.py:Wrong input file type.")
    ln=f.readline()
    while not ln.strip():
        ln=f.readline()
    seqdict={}
    EOF=False
    while ln:
        m=pat.search(ln)  
        if m and not '*' in ln:
            seqdict[m.group(1)]=m.group(2)
            ln=f.readline()
        elif not ln:
            EOF=True
            break
        else:
            break
    if not EOF:
        while True:
            ln=f.readline()
            if not ln:
                break
            m=pat.search(ln)
            if m and not '*' in ln:
                seqdict[m.group(1)]+='\n'+m.group(2)
    f.close()
    output=''
    for k,v in seqdict.items():
        output+='>%s\n%s\n'%(k,v)
    return output

if __name__ == "__main__":
    import sys
    tt=clw2afa(sys.argv[1])
    print tt

写得有点混乱,希望大家如果使用的话把BUG报告一下^^

以下文章也许和本文有点关系:

那年今天:

2条留言 跳到评论框

  1. YGC
    发表于September 30, 2008 2:14 AM | 永久链接

    转格式,还是bioperl强...

    你的blog写代码也不好啊..不能着色..没有缩排...

    看了一下wordpress,我也想玩一玩...

    [回复这条留言]

    azalea

    回复于September 30, 2008 2:33 AM

    曾经用过perl的,语法有点BT啊。。
    我也觉得wordpress贴代码比较崩溃。。
    主要是wp自动去除每段前面的空白符,我以前用一个插件可以自动着色的,现在没装了。
    另外有个网站可以进行代码着色:
    http://www.fayaa.com/code/
    刚刚改了一下,看看效果^^
    wordpress很强大啦,你用一下就知道新浪多么垃圾了。。
    话说你有兴趣的话可以用我的空间

    [回复这条留言]

    YGC

    回复于September 30, 2008 2:35 AM

    好啊...有什么限制吗?

    我再再找了个免费域名,找了个免费空间....

    早说嘛,我就不用找了...

    [回复这条留言]

    azalea

    回复于September 30, 2008 2:37 AM

    没。。你想个二级域名就好,比如xxx.azpala.com

    [回复这条留言]

    YGC

    回复于September 30, 2008 2:39 AM

    ygc.azpala.com

    azpala是什么意思?

    ygc是我名字的拼音首字母..

    [回复这条留言]

    azalea

    回复于September 30, 2008 2:58 AM

    azalea+pala,我和我LG的BBS ID ^^
    话说你的全名是?

    [回复这条留言]

    YGC

    回复于September 30, 2008 3:03 AM

    汗....想法跟我差不多...
    我就想过拿女方的名字,加上自己的姓....
    叫做"你的名字和我的姓氏"....发现我很会YY...

    没gf的...羡慕一下有LG的...

    我的名字叫余光创

    [回复这条留言]

    azalea

    回复于September 30, 2008 3:10 AM

    汗。。我lg羡慕你还来不及呢。。
    话说你的名字很独特

    [回复这条留言]

    YGC

    回复于September 30, 2008 3:36 AM

    余是姓..这个很费话
    光是辈份..祖谱里排的..
    创是我爷爷给取的...

    [回复这条留言]

    azalea

    回复于September 30, 2008 3:38 AM

    个么应该叫余光中。。

    [回复这条留言]

    YGC

    回复于September 30, 2008 2:38 AM

    第二句打错了,不是再再,是刚刚...我打五笔的..我是老人家...^^

    [回复这条留言]

    azalea

    回复于September 30, 2008 2:38 AM

    汗。。我理解成你一而再再而三地找域名
    真是辛苦了。。

    [回复这条留言]

    YGC

    回复于September 30, 2008 2:49 AM

    我就在你在筑巢好了...
    你是自己的空间?

    [回复这条留言]

  2. YGC
    发表于September 30, 2008 2:37 AM | 永久链接

    perl也不BT吧...

    写小脚本还是很舒服的...
    就是看别人的代码很头痛...

    [回复这条留言]

    azalea

    回复于September 30, 2008 2:40 AM

    唉 就是说这个。。
    实在看不懂别人的perl代码
    上学期改别人一个perl程序差点吐血了

    [回复这条留言]

    YGC

    回复于September 30, 2008 2:47 AM

    我开始转向用R了..
    功能注释才是主流了...

    [回复这条留言]

发表新留言

*
*