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

修改版Autodock程序pdbqt文件结果提取及日志生成技术问询

解决方案:提取PDBQT文件中的MODEL评分信息

以下是可以直接运行的Python脚本,能自动遍历指定文件夹内所有compound_*.pdbqt文件,提取每个化合物的MODEL编号、minimizedAffinity、CNNscore、CNNaffinity,并保存为逗号分隔的CSV文件(可按需改为制表符分隔):

import os
import re

# 设置目标文件夹路径(替换为你的实际文件夹路径)
target_dir = "./your_pdbqt_folder"
# 输出结果文件
output_file = "compound_scores.csv"

# 正则表达式匹配规则
model_pattern = re.compile(r"^MODEL\s+(\d+)")
min_affinity_pattern = re.compile(r"^REMARK minimizedAffinity\s+([\d\-\.]+)")
cnn_score_pattern = re.compile(r"^REMARK CNNscore\s+([\d\-\.]+)")
cnn_affinity_pattern = re.compile(r"^REMARK CNNaffinity\s+([\d\-\.]+)")

# 打开输出文件并写入表头
with open(output_file, "w", encoding="utf-8") as out_f:
    out_f.write("compound_id,model_id,minimizedAffinity,CNNscore,CNNaffinity\n")

    # 遍历文件夹内所有pdbqt文件
    for filename in os.listdir(target_dir):
        if not filename.startswith("compound_") or not filename.endswith(".pdbqt"):
            continue
        
        # 提取化合物编号
        compound_id = filename.split("_")[1].split(".")[0]
        file_path = os.path.join(target_dir, filename)
        
        current_model = None
        current_data = {
            "minimizedAffinity": None,
            "CNNscore": None,
            "CNNaffinity": None
        }

        # 读取单个pdbqt文件
        with open(file_path, "r", encoding="utf-8") as in_f:
            for line in in_f:
                line = line.strip()
                # 匹配MODEL编号
                model_match = model_pattern.match(line)
                if model_match:
                    # 写入上一个MODEL的数据(防止文件末尾无ENDMDL)
                    if current_model is not None and all(current_data.values()):
                        out_f.write(f"{compound_id},{current_model},{current_data['minimizedAffinity']},{current_data['CNNscore']},{current_data['CNNaffinity']}\n")
                    # 初始化新MODEL的数据
                    current_model = model_match.group(1)
                    current_data = {key: None for key in current_data}
                    continue
                
                # 匹配各个REMARK字段
                min_aff_match = min_affinity_pattern.match(line)
                if min_aff_match:
                    current_data["minimizedAffinity"] = min_aff_match.group(1)
                    continue
                
                cnn_score_match = cnn_score_pattern.match(line)
                if cnn_score_match:
                    current_data["CNNscore"] = cnn_score_match.group(1)
                    continue
                
                cnn_aff_match = cnn_affinity_pattern.match(line)
                if cnn_aff_match:
                    current_data["CNNaffinity"] = cnn_aff_match.group(1)
                    continue
                
                # 遇到ENDMDL时,写入当前MODEL的数据
                if line == "ENDMDL":
                    if current_model is not None and all(current_data.values()):
                        out_f.write(f"{compound_id},{current_model},{current_data['minimizedAffinity']},{current_data['CNNscore']},{current_data['CNNaffinity']}\n")
                    current_model = None
                    current_data = {key: None for key in current_data}
            
            # 处理文件末尾未闭合的MODEL块
            if current_model is not None and all(current_data.values()):
                out_f.write(f"{compound_id},{current_model},{current_data['minimizedAffinity']},{current_data['CNNscore']},{current_data['CNNaffinity']}\n")

print(f"处理完成,结果已保存至 {output_file}")

关键说明:

  • 路径设置:将target_dir替换为你的pdbqt文件所在的实际文件夹路径
  • 输出格式:默认生成CSV文件,若需要制表符分隔,只需把表头和写入行的逗号改为\t
  • 鲁棒性:自动处理文件末尾无ENDMDL的情况,跳过字段不完整的MODEL块(避免写入无效数据)
  • 精准匹配:用正则表达式精准定位目标字段,不会误读其他REMARK行

内容的提问来源于stack exchange,提问作者Phung Hien Le

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:02:42