爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 13575|回复: 2

[经验总结] Python处理Fortran的namelist文件

[复制链接]

新浪微博达人勋

发表于 2017-5-21 13:14:35 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 又是那隻貓 于 2017-5-23 16:48 编辑

可以说这是个小问题,大家如果在做与模式相关的内容总归会用到的
直接搜索也能找到,家园里可能大家都没在意这种小问题,但我觉着还是稍微总结一下比较好


本人才疏,现在用的是 f90nml 库。这个库比较简单,基本思路就是在Python自带的dictionary类型基础上加了对Fortran所用namelist格式的识别。具体有没有其他方便的工具,也没细看,如果你发现了也欢迎总结分享~
附上网址:
https://pypi.python.org/pypi/f90nml

http://f90nml.readthedocs.io/en/latest/


OK,开始吧

具体操作很简单

# 载入模块并打开文件

  1. import f90nml #载入模块

  2. nml_path = 'A/B/namelist.input'

复制代码

或者直接给路径
  1. nml = f90nml.read(nml_path)
复制代码


得到nml为多层字典(dict)组成的namelist类


# 更改和配置namelist

更改和取值直接用dict的操作
  1. nml['config_nml']['steps'] = 432
复制代码


这个相当于把下面的 xxx 设置成了 432
  1. &config_nml
  2. ...
  3. steps = xxx
  4. ...
  5. /
复制代码
当然,如果只是取值那你直接  
  1. a = nml['config_nml']['steps']
复制代码
这里需要注意一下,如果该值只是一个,那么会存成对应的内容,比如int什么的
但有时会有多个,会存成Python的list类型
用的时候注意判断,比如 WRF 的配置里会有 max_domain 这种



# 写入文件

写入也是直接路径或更靠谱些给文件对象
  1. with open('target.nml') as nml_file:
复制代码

或者
  1. nml.write('target.nml')
复制代码



如果想有原始批注和格式 comments and formatting ,用patch() 函数
  1. f90nml.patch(nml_file,nml, 'target.nml')
复制代码


上面那个nml 表示修改过的namelist , 第一个 nml_file 是要采取的文件格式(这里直接用了原文件),最后 target.nml 是输出
这里我个人是不建议写入原文件的。一般我都是直接写成新文件(在新路径下),类似于 先复制一份,然后修改 吧,但感觉更保险点儿,省得把原文件冲掉~


# End



希望对大家有帮助







点评

学习了  发表于 2017-5-23 15:24
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-30 21:37:03 | 显示全部楼层
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表