适配任意分子的TXT输出文件NAC耦合数据多行列解析方案求助
通用NAC输出文件解析实现方案
问题修复核心思路
- 针对数据覆盖问题:取消单变量存储匹配结果的逻辑,初始化列表存储所有匹配行的解析结果,每次命中匹配规则就追加数据到列表中
- 针对分子适配问题:新增原子元数据预解析逻辑,优先读取文件头部的原子总数、原子序号与对应类型信息存储为公共属性,解析耦合值时直接调用预存的元数据,无需硬编码特定分子的参数
示例实现代码
class NACParser(ParseSection): name = "coupling" def __init__(self): # 初始化存储容器避免数据覆盖 self.all_coupling_data = [] # 存储预解析的原子元数据:结构为 {原子序号: 原子类型, ...} self.atom_meta = {} self.total_atoms = 0 def pre_parse_atom_info(self, file_content): """预解析文件中的原子信息段,适配任意分子结构""" # 此处可替换为对应输出文件的原子信息行匹配规则,适配不同量化软件的输出格式 atom_lines = [line for line in file_content.splitlines() if "Atom" in line or "atomic number" in line] self.total_atoms = len(atom_lines) for idx, line in enumerate(atom_lines, 1): # 按实际文件格式调整原子类型提取逻辑即可 atom_type = line.strip().split()[-1] self.atom_meta[idx] = atom_type def parse(self, file_content): # 先预解析原子元数据 self.pre_parse_atom_info(file_content) # 匹配所有耦合值行,正则适配示例给出的(y,mz) = (xxx,xxx,xxx)格式 import re pattern = re.compile(r'y,mz\) = \((-?\d+\.?\d*D[+-]?\d+),(-?\d+\.?\d*D[+-]?\d+),(-?\d+\.?\d*D[+-]?\d+)\)') for line in file_content.splitlines(): match = pattern.search(line) if match: # 将Fortran风格科学计数法D转为Python可识别的e vals = [float(x.replace('D', 'e')) for x in match.groups()] # 追加数据到列表,不会覆盖之前的解析结果 self.all_coupling_data.append(vals) # 返回全量解析结果 return { "total_atoms": self.total_atoms, "atom_info": self.atom_meta, "coupling_values": self.all_coupling_data }
适配调整说明
- 正则匹配规则可根据实际输出文件的行格式调整,当前已适配你给出的
y,mz) = (-.504D-04,-.543D-04,-.538D-03)格式 - 仅需修改
pre_parse_atom_info方法内的行匹配和字段提取逻辑,即可适配不同量化软件的原子信息输出格式,核心解析逻辑无需改动
内容的提问来源于stack exchange,提问作者saya
相关产品推荐
相关产品推荐

