前面提到了可以根據(jù)樹的拓?fù)浣Y(jié)構(gòu)生成一系列與物種樹一致的基因樹;但其實也可以用同一個物種樹挽绩,然后把OG基因里的基因名替換成物種名。
同樣也需要一個genelist文件(這個文件生成參考前面的)脖阵,以及一個輸入的OG基因文件目錄拇派。
#!/usr/bin/python
# -*- coding: utf-8 -*-
# conda activate python3
"""
作者:徐詩芬
內(nèi)容:1. 打開single_copy_gene_list.txt文件,讀取第一行生成一個species list途戒;
2. 讀取剩下的行坑傅,讀取OG的id以及生成該id的基因列表gene list,
并且將species和gene列表并列起來生成一個字典;
3.根據(jù)OG的id打開Single_copy_gene里的id文件喷斋,讀取gene名唁毒,循環(huán)gene list,根據(jù)基因名替換成物種星爪,
創(chuàng)建一個與OG_id相同的文件直接寫入替換好的序列文件浆西,用writelines可以直接寫一個列表。
日期:2022.1.11
"""
import sys
import os
import subprocess
import re
from itertools import islice
def usage():
print('Usage: python change_gene.py [single_copy_gene_list.txt] [Input_dir] [Output_dir]')
def main():
name_list = open('single_copy_gene_list.txt', 'rt') # sys.argv[1]
input_dir = 'data\Single_copy_gene' #sys.argv[2] # 輸入文件夾顽腾,Single_copy_gene,
out_dir = 'data\Single_copy_gene_species' #sys.argv[3] # 運行前先創(chuàng)建一個近零,可以命名為Single_copy_gene_species
# subprocess.call(['mkdir', out_dir]) # linux系統(tǒng)自動創(chuàng)建output文件夾
species_list = []
name_list.seek(0, 0) # 加一個指針文件,運行完下面的第一行抄肖,后面的readline就可以直接從下一行開始
for head in islice(name_list, 0, 1): # 輸出第一行title
# head = name_list.readline() # 也可以這樣輸出title
species_list = head.strip().split("\t")[1:]
# line = name_list.readline()
for line in name_list: # 由于上面指定了文件開始位置久信,這里其實就是跳過第一行讀取剩下的行
OG_id = line.strip().split("\t")[0] # 讀取OG的id
gene_list = line.strip().split("\t")[1:] # 讀取該行所包含的所有物種基因名
pattern_dict = dict(zip(gene_list, species_list)) # 生成物種與基因名一一對應(yīng)的字典
OG_list = os.listdir(input_dir) # 生成一個輸入文件目錄里存在的文件列表
infile = f'{OG_id}.fa.mafft.fa'
if infile in OG_list: # 判斷infile是否在input_dir里面
fas_file = os.path.join(input_dir, infile)
pref = infile.split('.')[0]
with open(fas_file, 'r') as f:
new_lines = []
for fa_line in f:
if fa_line.startswith('>'):
name = fa_line.strip()[1:]
if name in list(pattern_dict.keys()):
new_line = re.sub(name, pattern_dict[name], fa_line) # 把基因名替換成該行里面的物種名
new_lines.append(new_line)
else:
new_lines.append(fa_line)
with open(f'{out_dir}/{pref}.mafft.fa', 'w') as out:
out.writelines(new_lines)
try:
main()
except IndexError:
usage()