哪种方法读取yaml文件,并且具有与ini的read方法相同的返回值?

时间:2019-02-13 16:24:36

标签: python yaml ini

我正在一个项目中,我想将.ini配置文件更改为.yaml。在一个函数中,我在读取.ini文件之前已返回,现在我希望它具有与.yaml文件相同的返回类型。我该怎么做呢? 有人可以告诉我这是什么样的回报吗?

  • 到.yaml文件

    stream = file('file.yaml', 'r')    
    return yaml.load(stream) ????
    return yaml.dump(stream) ???? ????
    
  • 到.ini文件

    config = ConfigParser.ConfigParser()    
    config.read('file.ini')
    return config
    

如果我打印config,则显示:

ConfigParser.ConfigParser instance at 0x000000000124FE08

1 个答案:

答案 0 :(得分:0)

自从您做config = ConfigParser.ConfigParser()以来,这是可以肯定的 config是一个ConfigParser实例。那有各种各样的特殊方法,其余的 您的程序将假定能够调用。

如果您不想更改程序的其余部分,则应设置YAML配置文件 在根目录下有一个映射,其键是INI文件中的部分名称, 值再次映射为代表每个部分的键值对:

section1:
  key1: value1
  key2: value2

section2:
  key1: value3
  key3: value4

然后加载该YAML文件,并将结果数据结构转换为ConfigParser实例 然后可以将其用作从INI文件读取的ConfigParser:

import sys
import ruamel.yaml
from configparser import ConfigParser


yaml = ruamel.yaml.YAML(typ='safe')
with open('file.yaml', 'r') as stream:
    data = yaml.load(stream)

config = ConfigParser()
config.read_dict(data)
config.write(sys.stdout)

给出:

[section1]
key1 = value1
key2 = value2

[section2]
key1 = value3
key3 = value4

因此config(假设您的file.yaml可以)可以传递给程序的其余部分。

请注意:

  • config.write()仅在此处显示结果为ConfigParser实例, 在最终程序中,您不需要。
  • 您的YAML加载示例未关闭输入流,这不是一个好习惯。使用with语句或将pathlib.Path传递给yaml.load

    from pathlib import Path
    file_name = Path('file.yaml')
    yaml.load(file_name)
    
  • 可以通过以下方式直接加载到ConfigParser实例中: 在您的YAML文件中标记根级别映射,并提供 适当的标签处理,但我认为这不值得。您的 时间最好花在更改程序的其余部分上 假设要处理data(两级字典) 结构)。