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

