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

Python遍历多FASTA文件提取短于100AA序列报错求助

修复提取目录下FASTA短序列脚本的AttributeError错误

你的脚本报错AttributeError: 'list' object has no attribute 'read'核心问题在于:

  • os.listdir(input_handle)返回的是目录下的文件名列表,但SeqIO.parse()要求传入单个文件的路径(字符串)或可读取的文件对象,直接传列表会让它尝试调用列表的read()方法,这自然行不通。
  • 另外原脚本还存在逻辑错误:把筛选出的序列对象追加到存储文件名的files列表里,最后SeqIO.write会混淆文件名和序列对象,导致后续问题。

以下是修正后的完整代码,附带关键修改说明:

from Bio import SeqIO
import sys
import os

def loop_extractsmorfs(input_dir, output_path):
    # 存储筛选后的短序列
    short_seqs = []
    # 遍历目录下的所有文件名
    for filename in os.listdir(input_dir):
        # 拼接完整文件路径
        file_path = os.path.join(input_dir, filename)
        # 只处理FASTA文件(可根据实际后缀调整,比如.fa/.fasta/.faa)
        if filename.endswith(('.fasta', '.fa', '.faa')):
            # 读取当前FASTA文件的所有序列
            for record in SeqIO.parse(file_path, "fasta"):
                # 筛选长度≤100AA的序列
                if len(record.seq) <= 100:
                    short_seqs.append(record)
    # 将所有筛选出的短序列写入输出文件
    SeqIO.write(short_seqs, output_path, "fasta")

if __name__=="__main__":
    loop_extractsmorfs(input_dir=sys.argv[1], output_path=sys.argv[2])

关键修改点:

  • 重命名参数为更清晰的input_dir和output_path,避免混淆"handle"的概念(原参数名容易误解为文件句柄)
  • 使用os.path.join(input_dir, filename)拼接完整文件路径,确保能正确找到目标文件
  • 增加FASTA文件后缀过滤,避免处理目录中的非FASTA文件
  • 创建独立的short_seqs列表存储筛选后的序列对象,彻底分离文件名和序列数据
  • 循环处理每个FASTA文件,逐个解析并筛选序列

运行方式:

在命令行执行:

python your_script.py /path/to/your/fasta_directory output_short_seqs.fasta

内容的提问来源于stack exchange,提问作者adcm67

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:36:32