You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:57:02