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
相关产品推荐
相关产品推荐

