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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:19:34