如何在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
针对这种格式简单的参数文件,你可以用手动解析的方式实现,不需要额外安装第三方库,步骤如下:
实现思路
- 逐行读取文件,跳过空行和注释行(以
!开头的行) - 剥离行内的注释内容,只保留赋值语句部分
- 拆分变量名和赋值内容,区分字符串、数值和表达式类型
- 对表达式(如
dnorm = dLK / rmin),利用已解析的变量计算结果 - 将所有变量存储到字典中,也可以直接映射到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
相关产品推荐
相关产品推荐

