如何统计id很复杂的fasta文件的长度?

本文探讨了在处理含有复杂ID的FASTA文件时遇到的问题,原本针对简单ID的脚本无法正确统计复杂的基因组数据,导致染色体数量统计出现偏差。为解决此问题,需要对现有脚本进行调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于一般的fasta文件的格式是:

>chr1

AAGCCATCCGG

但是最近两天遇到id很复杂的fasta,对于这样的fa文件用现有的脚本却统计错误


原本人的hg38染色体有23条染色体,但是统计出来却只有一条染色体的长度:


因此,需要重新修改length.pl

import os from Bio import SeqIO from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord # 定义文件路径 genome_file = r"C:\Users\Lenovo\Desktop\Botrytis_cinerea_genome.fa" gff_file = r"C:\Users\Lenovo\Desktop\Botrytis_cinerea.gff3" output_file = r"C:\Users\Lenovo\Desktop\Botrytis_cinerea_genes.fasta" # 读取基因组文件 genome_dict = SeqIO.to_dict(SeqIO.parse(genome_file, "fasta")) # 解析GFF3文件,提取基因位置信息 def parse_gff(gff_file): genes = {} with open(gff_file, "r") as gff: for line in gff: if line.startswith("#"): continue # 跳过注释行 fields = line.strip().split("\t") if len(fields) < 9: continue # 跳过格式不正确的行 seqid, source, feature, start, end, score, strand, phase, attributes = fields if feature == "gene": gene_id = None for attr in attributes.split(";"): if attr.startswith("ID="): gene_id = attr.split("=")[1] break if gene_id: genes[gene_id] = { "seqid": seqid, "start": int(start), "end": int(end), "strand": strand } return genes # 提取基因序列 def extract_genes(genome_dict, genes): gene_sequences = [] for gene_id, gene_info in genes.items(): seqid = gene_info["seqid"] start = gene_info["start"] end = gene_info["end"] strand = gene_info["strand"] if seqid not in genome_dict: print(f"Warning: Sequence ID {seqid} not found in genome file.") continue gene_seq = genome_dict[seqid].seq[start - 1:end] # GFF3位置是1-based if strand == "-": gene_seq = gene_seq.reverse_complement() gene_record = SeqRecord(gene_seq, id=gene_id, description="") gene_sequences.append(gene_record) return gene_sequences 逐行修改以上文件
03-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值