在Python中从文件加载参数
我正在写一个Python类,用来模拟一个过程,我想从一个文件中初始化参数,比如说这个文件叫做 'input.dat'
。这个输入文件的格式大概是这样的。
'input.dat'
文件内容:
Z0: 0 0
k: 0.1
g: 1
Delta: 20
t_end: 300
我写的代码如下。这个代码可以运行,但看起来有点多余而且不够灵活。有没有更好的方法来完成这个任务呢?比如说用一个循环来读取每一行,然后匹配关键词?
def load(self,filename="input.dat"):
FILE = open(filename)
s = FILE.readline().split()
if len(s) is 3:
self.z0 = [float(s[1]),float(s[2])] # initial state
s = FILE.readline().split()
if len(s) is 2:
self.k = float(s[1]) # kappa
s = FILE.readline().split()
if len(s) is 2:
self.g = float(s[1])
s = FILE.readline().split()
if len(s) is 2:
self.D = float(s[1]) # Delta
s = FILE.readline().split()
if len(s) is 2:
self.T = float(s[1]) # end time
8 个回答
1
试试下面这个:
def load(self, filename="input.dat"):
d = {"Z0": "z0", "k": "k", "g": "g", "Delta": "D", "t_end": "T"}
FILE = open(filename)
for line in FILE:
name, value = line.split(":")
value = value.strip()
if " " in value:
value = map(float, value.split())
else:
value = float(value)
setattr(self, d[name], value)
证明它有效:
>>> class A(object): pass
...
>>> a = A()
>>> load(a)
>>> a.__dict__
{'k': 0.10000000000000001, 'z0': [0.0, 0.0], 'D': 20.0, 'g': 1.0, 'T': 300.0}
40
假设这些参数是来自一个安全的地方(比如你自己或者用户提供的,而不是来自互联网),你只需要把参数文件做成一个Python文件,叫做 params.py
:
Z0 = (0, 0)
k = 0.1
g = 1
Delta = 20
t_end = 300
然后在你的代码里,你只需要这样写:
import params
fancy_calculation(10, k=params.k, delta=params.Delta)
这样做的好处有两个:1)简单明了,2)你可以在参数描述中使用Python的强大功能——这在这里特别有用,比如:
k = 0.1
Delta = 20
g = 3 * k + Delta
另外,你也可以使用Python自带的 JSON 或者 ConfigParser .INI 解析器模块。
20
- 如果你愿意尝试其他类型的文件来保存你的参数,我建议你使用一个 YAML 文件。
- 在Python中,你可以使用的库叫 PyYAML。这里有关于如何在Python中轻松使用它的介绍。
- 想要更好地了解,可以看看这篇维基百科的文章: http://en.wikipedia.org/wiki/YAML。
- 使用YAML的好处是,你可以把参数值以列表或映射的形式读取。
- 你一定会喜欢它的!