python重命名fasta序列

fasta文件的序列名很乱怎么办,自然是python重命名它喽。


fasta0.png
fasta1.png

这里只展示两种命名方式,一种是在“>”后面插入想要的字符串,后面的内容不变;另一种是按照升序的方式,结合给的字符串或默认的完全取代原来的序列名。写的时候采取边处理边写的方式,输出和之前的一样,不改变fasta序列宽度。代码如下,如果要统计fasta序列长度、gc等信息,则需要使用字典,全部处理完再写,这样写的fa文件为单行的,调整宽度参考[Python解析命令行调整fasta文件显示宽度Python解析命令行调整fasta文件显示宽度。

import re, os, sys
def fa_input(self, file):
        fileName = re.findall(r"\w*\..*$", file)[0]
        with open(file, "r") as f:
            fa = f.readlines()
            return fileName, fa

def fa_name(self,
                input,
                output="inputfile",
                name="filename",
                replace=True):
        fileName, fa = self.fa_input(input)
        if name == "filename":
            name = re.sub(r'\.\w*$', '', fileName)
        if output == "inputfile":
            output = re.sub(r'\.\w*$', '', input) + "_rename." + re.findall(
                r'\w*$', fileName)[0]
        outfile = open(output, "w")
        if replace:
            n = 0
            for i in fa:
                if i.startswith(">"):
                    outfile.write(">" + name + "_" + str(n) + "\n")
                    n += 1
                else:
                    outfile.write(i)

        else:
            for i in fa:
                if i.startswith(">"):
                    temp = ">" + name + "_"
                    i = re.sub(r">", temp, i)
                    outfile.write(i)
                else:
                    outfile.write(i)
        print("Have completed rename  {}".format(fileName))
if __name__ == "__main__":        
    file = "otu.fa"
# file = sys.argv[1] # 读取命令行参数用它
    fa_name(file)

上面的程序定义了两个函数,一个读取fa文件函数,没什么说的,fa_name函数是核心。fa_name函数有多个参数,只有输入文件是必须的,其他参数可选,分别是输出文件、用于重命名的字符串、序列名是取代还是插入。

sys.argv用于读取命令行参数,需要的话使用。

最后,上面的程序复制后记得检查缩进,复制进来缩进有点乱,最好自己敲一遍。

你可能感兴趣的:(python重命名fasta序列)