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

如何在Python中读取Fortran参数文件并完成变量赋值?

在Python中读取Fortran参数文件并实现变量赋值

首先看你提供的Fortran参数文件内容:

Nsc = 9

dLK = 0.0050 ! = (\nu^3/\epsilon)^(1/4). dLK_Simu256 = 5e-3
rmin = 50.0
dnorm = dLK / rmin


dir_sc  = "sc_data/aaVATtest20Jan/"
dir_in  = "512_no_B0/"
dir_out = "512_no_B0/out/"

datestr = "1790037599" 
! 1790037599
! 1790231999
! 1790512799
! 1790836799
! 1791088799


theta_s = 80.0   !angle w/ the z axis. 0 is along z, 90 is in the xy plane
phi_s   = 5.0    !angle w/ the x axis

针对这种格式简单的参数文件,你可以用手动解析的方式实现,不需要额外安装第三方库,步骤如下:

实现思路

  1. 逐行读取文件,跳过空行和注释行(以!开头的行)
  2. 剥离行内的注释内容,只保留赋值语句部分
  3. 拆分变量名和赋值内容,区分字符串、数值和表达式类型
  4. 对表达式(如dnorm = dLK / rmin),利用已解析的变量计算结果
  5. 将所有变量存储到字典中,也可以直接映射到Python的命名空间

完整代码示例

# 初始化字典存储参数
params = {}

# 读取参数文件(假设文件名为params.txt)
with open('params.txt', 'r') as f:
    for line in f:
        # 去除行首尾空白字符
        line_clean = line.strip()
        # 跳过空行和纯注释行
        if not line_clean or line_clean.startswith('!'):
            continue
        # 剥离行内的注释内容
        if '!' in line_clean:
            line_clean = line_clean.split('!')[0].strip()
        # 拆分变量名和赋值内容
        var_name, value_str = line_clean.split('=', 1)
        var_name = var_name.strip()
        value_str = value_str.strip()
        
        # 处理带双引号的字符串类型
        if value_str.startswith('"') and value_str.endswith('"'):
            params[var_name] = value_str.strip('"')
        else:
            try:
                # 计算表达式(利用已解析的变量作为上下文)
                value = eval(value_str, {}, params)
                params[var_name] = value
            except:
                # 尝试转换为整数,失败则转为浮点数
                try:
                    params[var_name] = int(value_str)
                except ValueError:
                    params[var_name] = float(value_str)

# 可选:将参数映射到当前命名空间,直接使用变量名(如Nsc、dLK)
locals().update(params)

# 测试输出
print(f"Nsc = {Nsc}")
print(f"dnorm = {dnorm}")
print(f"dir_sc = {dir_sc}")

关键细节说明

  • 注释处理:无论是整行注释还是行尾注释,都会被剥离,只保留有效赋值语句
  • 表达式计算:通过eval函数结合已解析的变量上下文,实现和Fortran一致的表达式求值(注意:仅适用于你自己可控的参数文件,避免恶意代码风险)
  • 类型自动转换:自动区分整数、浮点数和字符串类型,匹配Fortran中的变量类型
  • 变量映射:通过locals().update(params)可以直接用变量名访问参数,和Fortran中的使用方式完全一致

可选方案:使用第三方库

如果你的参数文件后续会变得更复杂(比如包含数组、模块定义等),可以使用专门处理Fortran namelist的库f90nml,安装后只需几行代码即可解析:

import f90nml

# 读取参数文件
nml = f90nml.read('params.txt')
# 提取变量
params = nml.items()

不过对于当前的简单格式,手动解析足够轻量且无需额外依赖。

内容的提问来源于stack exchange,提问作者lalchimista

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:35:27