利用Biopython库进行初步生物信息统计

Fasta文件简介

fasta文件:该文件用于存储序列信息
特点:
	由标题部分和序列部分组成
	总是以>开头
	>到第一个空格为该序列的名称
	其余部分为该序列的寿命
	一个fasta文件中可以包含多条序列

例子:

X17276.1|kraken:taxid|9646 Giant Panda satellite 1 DNA
GATCCTCCCCAGGCCCCTACACCCAATGTGGAACCGGGGTCCCGAATGAAAATGCTGCTGTTCCCTGGAGGTGTTTTCCTGGACGCTCTGCTTTGTTACCAATGAGAAGGGCGCTGAATCCTCGAAAATCCTGACCCTTTTAATTCATGCTCCCTTACTCACGAGAGATGATGATCGTTGATATTTCCCTGGACTGTGTGGGGTCTCAGAGACCACTATGGGGCACTCTCGTCAGGCTTCCGCGACCACGTTCCCTCATGTTTCCCTATTAACGAAGGGTGATGATAGTGCTAAGACGGTCCCTGTACGGTGTTGTTTCTGACAGACGTGTTTTGGGCCTTTTCGTTCCATTGCCGCCAGCAGTTTTGACAGGATTTCCCCAGGGAGCAAACTTTTCGATGGAAACGGGTTTTGGCCGAATTGTCTTTCTCAGTGCTGTGTTCGTCGTGTTTCACTCACGGTACCAAAACACCTTGATTATTGTTCCACCCTCCATAAGGCCGTCGTGACTTCAAGGGCTTTCCCCTCAAACTTTGTTTCTTGGTTCTACGGGCTG

GFF/GTF文件简介

GFF/GTF文件: 该文件属于注释文件,包括许多信息,对fasta进行额外的
说明,每条信息有九列,都以/t进行分割,每一列代表的意思如下所示
  1. seqname - name of the chromosome or scaffold; chromosome names can be given with or without the ‘chr’ prefix. Important note: the seqname must be one used within Ensembl, i.e. a standard chromosome name or an Ensembl identifier such as a scaffold ID, without any additional content such as species or assembly. See the example GFF output below.
  2. source - name of the program that generated this feature, or the data source (database or project name)
  3. feature - feature type name, e.g. Gene, Variation, Similarity
  4. start - Start position* of the feature, with sequence numbering starting at 1.
  5. end - End position* of the feature, with sequence numbering starting at 1.
  6. score - A floating point value.
  7. strand - defined as + (forward) or - (reverse).
  8. frame - One of ‘0’, ‘1’ or ‘2’. ‘0’ indicates that the first base of the feature is the first base of a codon, ‘1’ that the second base is the first base of a codon, and so on…
  9. attribute - A semicolon-separated list of tag-value pairs, providing additional information about each feature.

例子

##gff-version 3
NC_045512.2     RefSeq  gene    266     21555   .       +       .       ID=gene-		GU280_gp01;Dbxref=GeneID:43740578;Name=ORF1ab;gbkey=Gene;gene=ORF1ab;	gene_biotype=protein_coding;locus_tag=GU280_gp01
NC_045512.2     RefSeq  CDS     266     13468   .       +       0       ID=cds-YP_009724389.1;Parent=gene-GU280_gp01;Dbxref=Genbank:YP_009724389.1,GeneID:43740578;Name=YP_009724389.1;Note=pp1ab%3B translated by -1 ribosomal frameshift;exception=ribosomal slippage;gbkey=CDS;gene=ORF1ab;locus_tag=GU280_gp01;product=ORF1ab polyprotein;protein_id=YP_009724389.1

习题

提取CDS区域,说明仅仅保留ID= 、Name=、 Locus_tag 其他部分去掉
import re
from Bio import SeqIO
import gzip


def test1():
	# 打开.gff文件
    fr = open('./**.gff')
    fr2 = open('./test1.gff', 'w')
    
    for fr_line in fr.readlines():
    	# 按行读取文件中内容
        if fr_line[0] == '#':
        	# 将源文件之前的注释写入test1.gff中
            fr2.write(fr_line)
            continue
            
        # 按照/t进行切片操作
        result = re.split(r'\t', fr_line)
        # 第八列为说明部分,并以;分割,因此按照;切片找到想要的数据
        result2 = re.split(r';', str(result[8]))
        
        if result[2] == "CDS":
        	# 提取类型为CDS的所有信息
            for i in range(8):
                fr2.write(result[i] + '\t')
                
            for temp in result2:
            	# 找到ID,Name,locus_tag信息保存到test1.gff中
            	# 其他信息不需要
                s1 = re.split(r'=', temp)
                if s1[0] == 'ID':
                    fr2.write(s1[0] + '=' + s1[1] + ';')
                elif s1[0] == 'Name':
                    fr2.write(s1[0] + '=' + s1[1] + ';')
                elif s1[0] == 'locus_tag':
                    fr2.write(s1[0] + '=' + s1[1] + '\n')
    print('test1.gff文件已写完')
	#关闭文件
    fr.close()
    fr2.close()
if __name__ == '__main__':
    test1()
提取1中对应的序列,修改每条序列的描述信息为ID= 、Name=、 Locus_tag信息
import re
from Bio import SeqIO
import gzip

def test2():
	# 打开文件句柄
    inflie = open('./**.fasta')
    # 文件句柄转换为seqs
    seqs = SeqIO.parse(inflie, 'fasta')
    
    fr = open('./test1.gff')
    fr2 = open('./test2.fasta', 'w')
    
    # 读取fasta文件的每条信息
    seq1 = next(seqs)
    seq_list = str(seq1._seq)
    
    for fr_line in fr.readlines():
    	# 按行读取.gff文件获取序列的起始终止位置
        if fr_line[0] == '#':
            continue
            
        # 按照制表符进行分割
        result = re.split(r'\t', fr_line)
        # 最后一列按照‘;’进行分割并把‘=’去掉写入文件中
        result2 = re.split(r';', result[8])
        fr2.write(">" + re.split(r'=', result2[0])[1] + " name:" +
                  re.split(r'=', result2[1])[1] + " Locus_tag:" +
                  re.split(r'=', result2[2])[1])
                  
        # 根据起始位置获取相应的序列并写入文件中
        seq2 = seq_list[int(result[3]) - 1:int(result[4])]
        fr2.write(seq2 + '\n')
    print('test2.fasta文件已写完')
    fr.close()
    fr2.close()
    
if __name__ == '__main__':
    test2()

结果展示:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rich_Z_b_f

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值