fasta文件的序列名很乱怎么办,自然是python重命名它喽。
这里只展示两种命名方式,一种是在“>”后面插入想要的字符串,后面的内容不变;另一种是按照升序的方式,结合给的字符串或默认的完全取代原来的序列名。写的时候采取边处理边写的方式,输出和之前的一样,不改变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用于读取命令行参数,需要的话使用。
最后,上面的程序复制后记得检查缩进,复制进来缩进有点乱,最好自己敲一遍。