Python实现从multi FASTA文件每隔n条随机抽取1条序列输出到新文件
错误原因梳理
- 直接报错根因:
choose = [random.randint(1,totseq-1) for i in randseq]生成的是存储多个整数的列表,Python列表不支持直接用列表作为索引取值,因此抛出TypeError: list indices must be integers, not list - 原有逻辑完全不符合需求:你需要的是每n条序列为一组,每组随机抽1条,但原代码逻辑是尝试生成随机索引直接抽取,且存在循环遍历输入文件名字符串、使用未定义的
randseq/outrandseq变量、用内置函数名range作为变量名、随机索引从1开始漏掉第一条序列、无去重逻辑等多处问题。
修正后可运行代码
# 导入依赖库 import sys import random from Bio import SeqIO # 读取输入参数 n = int(sys.argv[1]) # 用户自定义的每组序列数,每n条抽1条 infile = sys.argv[2] outfile = sys.argv[3] # 读取所有fasta序列 seq_records = list(SeqIO.parse(infile, "fasta")) tot_seq = len(seq_records) print(f"输入fasta文件:{infile}") print(f"原文件总序列数:{tot_seq}") # 按每n条为一组拆分,每组随机抽1条 out_records = [] for group_idx in range(0, tot_seq, n): # 取当前组的所有序列 current_group = seq_records[group_idx: group_idx + n] # 组内随机选1条 picked_seq = random.choice(current_group) out_records.append(picked_seq) print(f"最终抽取序列数:{len(out_records)}") print(f"输出fasta文件:{outfile}") # 写入输出文件 SeqIO.write(out_records, outfile, "fasta")
使用说明
运行方式和你原来的调用逻辑完全一致,示例:
python fasta_extractor.py 5 genesTPS.fa genes_ext.fasta
如果你的环境是Python2,把代码里的print语句改成Python2的无括号格式即可,核心抽取逻辑通用。
内容的提问来源于stack exchange,提问作者Pedro Henrique
相关产品推荐
相关产品推荐

