如何将Fortran模型的配置文件解析为Python字典?
解析Fortran配置文件为Python字典的实现方案
我之前刚好处理过类似的Fortran配置文件解析需求,这里给你分享一个实用的实现方案,帮你把这类带行号和数组索引的配置转成Python字典。
先明确配置文件的典型结构
假设你的Fortran配置文件是这种风格(行号+注释标注变量归属):
1: 100 ! 数组var1的第一个元素
2: 200 ! 数组var1的第二个元素
3: "output.txt" ! 字符串变量var2
4: 3.14 ! 变量var3
5: 50 60 70 ! 数组var4的三个元素
核心思路
正如你想到的:先把配置文件读取成按行存储的列表,再定义一个位置映射字典(用变量名做键,值对应它在列表中的行索引/元素范围),最后遍历映射关系提取对应值,生成最终的参数字典。
步骤1:读取并预处理配置文件
先把文件读进来,顺便清理空白行、注释,拆分每行的有效内容:
def read_config(file_path): with open(file_path, 'r') as f: lines = f.readlines() processed_lines = [] for line in lines: # 去掉首尾空白 line_stripped = line.strip() # 跳过空行和纯注释行 if not line_stripped or line_stripped.startswith('!'): continue # 拆分行号和内容(假设行号格式是"数字:") if ':' in line_stripped: _, content = line_stripped.split(':', 1) content = content.strip() # 把内容拆分成单个元素(兼容单个值和数组) processed_lines.append(content.split()) else: # 无行号的情况直接拆分内容 processed_lines.append(line_stripped.split()) return processed_lines
步骤2:定义位置映射字典
这个字典用来明确每个变量对应哪些行/元素,灵活适配单行值、多行数组、单行数组等情况:
# 位置映射规则: # - 单个行索引:对应单行的单个值或单行数组 # - 行索引列表:对应多行组成的数组 position_map = { 'var1': [0, 1], # 对应原文件第1、2行(Python列表是0索引) 'var2': 2, # 对应原文件第3行 'var3': 3, # 对应原文件第4行 'var4': 4 # 对应原文件第5行的数组 }
步骤3:生成最终的参数字典
遍历映射关系,提取值并自动做类型转换(字符串转数值,失败则保留原字符串):
def build_param_dict(processed_lines, position_map): param_dict = {} for var_name, position in position_map.items(): if isinstance(position, list): # 处理多行组成的数组 values = [] for idx in position: val = processed_lines[idx][0] # 尝试转成数值,失败则保留原字符串 try: val = float(val) if '.' in val else int(val) except ValueError: pass values.append(val) param_dict[var_name] = values elif isinstance(position, int): # 处理单行内容 line_elements = processed_lines[position] if len(line_elements) == 1: # 单行单个值 val = line_elements[0] try: val = float(val) if '.' in val else int(val) except ValueError: pass param_dict[var_name] = val else: # 单行数组 values = [] for elem in line_elements: try: elem = float(elem) if '.' in elem else int(elem) except ValueError: pass values.append(elem) param_dict[var_name] = values return param_dict
步骤4:调用示例
把上面的函数组合起来运行:
if __name__ == '__main__': config_content = read_config('fortran_config.txt') final_params = build_param_dict(config_content, position_map) print(final_params)
运行后会得到这样的字典:
{ 'var1': [100, 200], 'var2': 'output.txt', 'var3': 3.14, 'var4': [50, 60, 70] }
扩展说明
- 如果你的配置文件行号格式不同(比如没有冒号),可以调整
read_config里的拆分逻辑; - 要是有二维数组这类复杂结构,可以扩展
position_map的格式,比如用(起始行号, 结束行号, 列索引范围)来指定; - 类型转换部分可以根据需求自定义,比如强制转成特定类型,或者完全保留原始字符串。
内容的提问来源于stack exchange,提问作者tadzi
相关产品推荐
相关产品推荐

