如何用Python从数千个Vina对接日志文件提取最低结合能并导出TXT
可行的Python实现方案
核心逻辑
- 批量遍历指定目录下的日志文件
- 从每个文件中提取第一个出现的负浮点数结合能(对应Top10里的最低值)
- 将文件名(药物ID)和提取到的能量值写入
output.txt,两列用制表符分隔
实现代码
import os import re # 替换为你的日志文件所在目录 LOG_FOLDER = "./vina_logs" # 输出结果文件名 RESULT_FILE = "output.txt" # 正则匹配结合能:适配Vina日志里类似 "-3.7 kcal/mol" 或表格行里的数值 # 如果你的日志是表格格式(比如" 1 -3.7 0.000 0.000"),用下面的正则替换掉当前的 # ENERGY_REGEX = re.compile(r'^\s*\d+\s+(\-?\d+\.\d+)', re.MULTILINE) ENERGY_REGEX = re.compile(r'^(\-?\d+\.\d+) kcal/mol', re.MULTILINE) # 写入结果文件 with open(RESULT_FILE, 'w', encoding='utf-8') as result_f: # 遍历目录下所有文件 for file_name in os.listdir(LOG_FOLDER): # 只处理日志文件,后缀可根据实际调整 if file_name.endswith(".log"): full_path = os.path.join(LOG_FOLDER, file_name) try: with open(full_path, 'r', encoding='utf-8') as log_f: log_content = log_f.read() # 查找第一个匹配的结合能 match_result = ENERGY_REGEX.search(log_content) if match_result: lowest_energy = match_result.group(1) result_f.write(f"{file_name}\t{lowest_energy}\n") else: # 标记未找到的情况 result_f.write(f"{file_name}\t未提取到结合能\n") except Exception as err: # 处理文件读取异常 result_f.write(f"{file_name}\t读取失败: {str(err)}\n") print(f"处理完成,结果已保存到 {RESULT_FILE}")
关键说明
- 路径配置:把
LOG_FOLDER改成你存放日志文件的实际路径,比如"D:/vina_results/logs" - 正则适配:
- 如果日志里结合能是单独一行的
-3.7 kcal/mol,用默认的正则 - 如果是表格形式(Vina默认输出的Top10结果),注释掉默认正则,启用表格版的正则
- 如果日志里结合能是单独一行的
- 异常处理:脚本会自动跳过读取出错的文件,并在结果里标记,不会因为单个文件问题中断批量处理
- 输出格式:用制表符分隔两列,直接用Excel打开就能自动分成两列
内容的提问来源于stack exchange,提问作者Amal
相关产品推荐
相关产品推荐

