Python分割fasta文件

CPC可以从转录组得到的fasta序列中分析出哪些是编码RNA,哪些是lncRNA,但是它的速度实在是太慢了。我写了一个脚本,将fasta文件分割成更小的文件,在不同计算节点上面同时运行CPC以提高速度。CPC在balst比对这一步是支持多线程的,但是并不支持跨节点。对于某些不直接支持多线程的程序,将输入文件分割,再同时运行程序,是一种常用思路。

用法:python3 split_fasta.py -i input.fasta -o prefix -x split_number
-i 指定输入的fasta文件
-o 指定输出文件的前缀,默认是split_
-x 指定分割文件中fasta序列的数目,最后一个文件小于等于指定的数目,默认是1

命令:grep “>” file.fasta |wc -l
可以用来查看fasta文件中,有多少条fasta序列

代码如下:
split_fasta.py

# -*- coding: utf-8 -*-
 
import sys, getopt
 
# get parameter
opts, args = getopt.getopt(sys.argv[1:], "hi:o:x:")
X = 1
input_file = ""
prefix = "split_"
for op, value in opts:
    if op == "-i":
        input_file = value
    elif op == "-o":
         prefix = value
    elif op == "-x":
        X = int(value)
    elif op == "-h":
        print("Usage: python3 split_fasta.py -i input.fasta -o prefix -x split_number")
        print("default prefix = split_")
        print("default split_number = 1")
        sys.exit()
 
FA_in_file = open(input_file, "r")
 
# read fasta file to a list
fa_Info = []
fa_Seq = []
fa_Num = -1
for Y in FA_in_file.readlines():
    Y = Y.rstrip()
    if Y[0] == ">":
        fa_Info.append(Y)
        fa_Num = fa_Num + 1
        fa_Seq.append("")
    else:
        fa_Seq[fa_Num] = fa_Seq[fa_Num] + Y
 
# split the fasta list to multipe files
file_Num = (fa_Num + 1)//X + 1
for i in range(file_Num):
    exec(prefix + str(i + 1) + ' = open("' + prefix + str(i + 1) + '.fasta"' + ', "w")')
    start = i * X
    end = (i + 1) * X
    if end > fa_Num + 1:
        end = fa_Num + 1
    for j in range(start, end, 1):
        exec(prefix + str(i + 1) + '.write(fa_Info[j] + "\n")')
        while len(fa_Seq[j]) > 60:
            exec(prefix + str(i + 1) + '.write(fa_Seq[j][:60] + "\n")')
            fa_Seq[j] = fa_Seq[j][60:]
        else:
            exec(prefix + str(i + 1) + '.write(fa_Seq[j] + "\n")')
    exec(prefix + str(i + 1) + '.close()')
 
FA_in_file.close()