zoukankan      html  css  js  c++  java
  • 04-配置文件:.ini和.yaml

    为了是程序中的一些必要参数在根据不同的使用场景不需要每次都去修改代码源文件,所以可以讲这些参数写在配置文件中,然后在不同的应用场景中,去修改配置文件即可,不用去修改代码源文件。

    常用的配置文件中.ini文件和.yaml文件。

    1. .ini配置文件

    1.1 .ini配置文件的编写格式。

    .ini文件的书写需要三要素:sectionoptionsvalues

    每一个section都相当于一个段落,这个段落中存放的是options=value格式的配置信息。

    每一个.ini配置文件都可以有多个section段落,分别代表不同的配置信息。section是一个配置信息的段落名,所以它是单独独占一行,且需要被写在[]中。

    ; 这是注释
    [section0]
     
    key0 = value0
    key1 = value1
     
    [section1]
     
    key2 = value2
    key3 = value3
    

    .ini配置文件中也可以有注释,注释是写在以;开头的行中。

    1.2 python读取配置文件信息

    python中,有一个内置的读取.ini文件的类库,它专门用于对.ini配置文件进行读取或是写入操作:configparser

    from configparser import ConfigParser
    
    parse = ConfigParser()
    
    # 读取ini文件
    s = parse.read("conf.ini",  encoding="utf-8")
    
    # 按需读取文件中的配置信息
    val = parse.get("email_qq", "sender")
    print(val, type(val))
    

    读取.ini文件操作步骤:

    1. 引入configparser库,使用其中的ConfigParser类。

    from configparser import ConfigParser
    

    2. 实例化ConfigParser

    parse = ConfigParser()
    

    3. 运用实例化的对象,调用ConfigParser类中的read方法,将.ini文件整体读取到电脑内存中。

    parse.read("conf.ini",  encoding="utf-8")
    

    这个方法接收两个参数:一个是配置文件,可以读取一个配置文件,也可以读取多个配置文件;还有一个是编码格式,默认的编码格式是None,但是为了防止配置文件中有中文, 所以将编码格式设置成utf-8

    4. 按需读取,使用get()方法,读取想要的数据。

    val = parse.get("email_qq", "sender")
    print(val, type(val))
    

    该方法接收两个参数:一个是配置文件的section名,因为需要按照不同的需求, 从不同的section中取值;另一个就是options名。

    这样就可以配置文件中,按照sectionoptions两个条件来获取需要的数据。

    但是,get方法读取出来的数据,全部是字符串类型的数据。ConfigParser类还提供读取整型,浮点型和布尔型数据的方法。

    parse.getboolean("email_qq", "is_ok")
    parse.getint("email_qq", "port")
    parse.getfloat("email_qq", "pwd")
    

    但是,需要注意的是:如果想要读取出来的数据时布尔值,那么在配置文件中存放的数据要看起来像是布尔类型, 也就是存放的数据要是True/False或是true/false才可以。

    1.3 一次性读取ini配置文件中的信息

    python内置的configparser库中,没有提供一次性读取全部数据的方法,所以需要去手动实现这一功能。

    实现的思路就是:先获取ini文件中的全部sections,然后再获取每个sections中的全部options,最后根据options去取值。

    from configparser import ConfigParser
    
    parse = ConfigParser()
    s = parse.read("conf.ini",  encoding="utf-8")
    
    # 获取ini文件中的全部section
    section_list = parse.sections()
    print(section_list)
    
    val_list = []
    for section in section_list:
        # 获取每个section中全部option
        option_list = parse.options(section)
        for option in  option_list:
            val = parse.get(section, option)
            val_list.append(val)
    
    print(val_list)
    

    2. yaml配置文件

    yamlpython中的比较多。

    yaml是一种简介的非标记语言,以数据为中心,使用空白、缩进、分行组织数据, 从而使得表示更加简介 容易。

    yaml的基本规则:

    1. 大小写敏感;
    2. 使用缩进表示层级关系 - ,并且可以直接转换成python中的数据。
    3. 禁止使用tab表示缩进,只能适用空格。
    4. 缩进长度没有限制,只要元素对齐就表示这些数据属于一个层级。
    5. 使用#表示注释
    6. 字符串可以不用引号标注。
    2.1 yaml语法规则

    yaml语法支持字典,列表,和纯量。

    2.1.1 字典

    yaml语法中,使用英文冒号表示一组键值,并且使用缩进表示字典的嵌套:

    info:
      name: Tom
      age: 18
      gender: 男
    

    上组例子,如果转换成python中的字典,则表示为:

    {
        "info": {
            "name": "Tom",
            "age": 18,
            "gender": "男"
        }
    }
    
    2.1.2 列表

    yaml语法中,使用-表示一个列表中的元素,通过缩进,表示列表中嵌套列表。

    - China
      - 山东
      - 山西
    - USA
    - Japan
    

    以上数据,在python中的表示为:

    [
        "China",
        ["山东", "山西"],
        "USA",
        "Japan"
    ]
    

    但是注意:在yaml文件中进行编写的时候,要么是整体是一个字典,要么是整体是一个列表,不能出字典与列表并存的现象;但是允许字典中嵌套列表,或是列表中嵌套字典等的数据嵌套关系。

    2.2 读取.yaml文件

    python中使用第三方库pyyaml来读取.yaml文件。

    下载安装pyyaml库:pip install pyyaml

    读取文件的步骤很简单:

    1. 引入pyyaml
    2. 打开yaml文件;
    3. 使用load方法读取文件数据。
    import yaml
    
    # 打开yaml文件
    with open("conf.yaml", encoding="utf-8") as f:
        # 使用yaml中的load方法,这个方法需要传递两个参数,一个是文件句柄,一个是yaml提供的加载器
        data = yaml.load(f, yaml.FullLoader)
        print(data)
    

    注意:在引入模块的时候,引入的是yaml,而不是pyyaml;使用pyyaml读取文件的时候,是一次性将文件中的全部读取完毕。

  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/Pilaoban/p/13173085.html
Copyright © 2011-2022 走看看