在使用iTOL或者Evolview可视化进化树时,往往nwk格式的bootstrap值需要转化为百分数

使用re正则匹配

参考作者使用re正则查找到以)开头,:结尾,中间是四位小数的数值,去掉头尾之后,转化为浮点数,乘以100,四舍五入,转化为整数,最后转化为字符串。然后使用re.sun()进行替换,将原来的小数转化为百分数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/python
# Usage: python convertBootstrap2Integer.py tree.nwk > new.tree.nwk
# The bootstrap data of phylogenetic tree is decimal. This script convert decimal data to percentage without %.

import sys, re
inputNwkTree = sys.argv[1]
treeData = open(inputNwkTree).readlines()[0]
treeData = treeData.strip()
totalDecimalData = re.finditer('\)(\d\.\d{4})\:', treeData)
for item in totalDecimalData:
    matchedData = item.group()
    matchedData = matchedData[1:-1]
    convertedData = '%s' %(int(round(float(matchedData)*100)))
    treeData = re.sub(matchedData, convertedData, treeData)
print treeData

Debug

大部分情况下,该程序工作良好。但在某些时候,得到的进化树存在错误。

这是由于程序直接使用数值进行替换。若在进化树中,该数值还出现在非bootstrap的位置,则同样会被替换,导致生成的树文件出错。要解决此问题,我们可以直接连带bootstrap值前后的):一起作为字符串进行替换,从而避免错误的匹配。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/env python
# Usage: python convertBootstrap2Integer.py tree.nwk new.tree.nwk
# The bootstrap data of phylogenetic tree is decimal. This script convert decimal data to percentage without %.
import sys
import re
inputNwkTree = sys.argv[1]
treeData = open(inputNwkTree).readline().strip()
totalDecimalData = re.finditer('\)(\d\.\d{4})\:', treeData)
for item in totalDecimalData:
    matchedData = item.group()
    matchedNum = matchedData[1:-1]
    convertedData = ')%s:' % (int(round(float(matchedNum) * 100)))
    treeData = re.sub(re.escape(matchedData), convertedData, treeData)
with open(sys.argv[2], 'w') as o:
    o.write(treeData)

值得注意的是,在第13行treeData = re.sub(re.escape(matchedData), convertedData, treeData)中,若直接使用treeData = re.sub(matchedData, convertedData, treeData),则会出现re.error: unbalanced parenthesis at position 0报错。这是由于在正则替换时,括号)是需要转义的,此时,我们可以使用re.escape()进行转义。

参考来源

http://blog.sina.com.cn/s/blog_8dac0f5f0102wyz8.html

https://stackoverflow.com/questions/15947140/python-regex-error-unbalanced-parenthesis