在Python中从文件加载参数

25 投票
8 回答
66233 浏览
提问于 2025-04-17 08:27

我正在写一个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的好处是,你可以把参数值以列表或映射的形式读取。
  • 你一定会喜欢它的!

撰写回答