• 树莓派Python读写配置文件--configparser库


    >> [目录] 数据远程采集 Step by Step

     

    配置文件格式


    配置文件(*.ini)的基本格式如下:

    [device]
    type = NULL
    id = 1
    
    [comn]
    protocol = 0
    lenth = 400
    filter_min = 120
    filter_max = 400
    
    [wifi]
    ssid = user_ssid_null
    psk = user_psk_null

    [device]、[comn]、[wifi] 这些叫做 sections(节),每个section下面包含多个options(参数)/items(参数对,和字典的概念类似),例如:type = NULL,这里的“type”就叫做option,而(’type’,  ‘NULL’)被称为item。参数的值均是以string格式存储的。

     

    configparser库


    使用Python的configparser库来读写配置文件,configparser官方文档:

    https://docs.python.org/3/library/configparser.html#configparser.ConfigParser

    搜索ConfigParser Objects,这一节有函数详细的功能介绍,下面列一部分常用的:

    cf = configparser.ConfigParser() 创建configparser实例
    sections() 返回sections的列表
    add_section(section) 增加一个section
    remove_section(section) 删除一个section
    has_section(section) 返回某个section是否存在
    options(section) 返回某个section下的options列表
    has_option(section, option) 返回某个section下的某个option是否存在
    remove_option(section, option) 删除某个section下的某个option
    items() 获得所有的sections,包括默认section
    items(section) 获得某个section下的所有items/参数对
    read(filenames) 读取某个配置文件filenames,加载到ConfigParser实例
    get(section, option) 以string格式,返回某个section下的某个option的值
    getint(section, option) 以int格式,返回某个section下的某个option的值
    getfloat(section, option) 以float格式,返回某个section下的某个option的值
    getboolean(section, option) 以boolean格式,返回某个section下的某个option的值
    set(section, option, value) 设置某个section下的某个option的值
    write(fileobject) 将当前的ConfigParser实例写入到配置文件fileobject


    生成配置文件


    ConfigParser库在Python2和Python3中有点区别:

    • Python3

    configparser库的首字母小写

    import configparser

    config = configparser.ConfigParser()


    创建文件test_config_create_p3.py,复制下面的内容,保存退出

    pi@raspberrypi:~ $ sudo nano test_config_create_p3.py

      1 # -*- coding:utf-8 -*-
      2 import configparser
      3 
      4 config = configparser.ConfigParser()
      5 
      6 config["device"] = {
      7   'type'       : 'NULL',
      8   'id'         : '1'
      9 }
     10 
     11 config["comn"] = {
     12   'protocol'   : '0',
     13   'lenth'      : '400',
     14   'filter_min' : '50',
     15   'filter_max' : '400'
     16 }
     17 
     18 config["wifi"] = {
     19   'ssid'       : 'user_ssid_null',
     20   'psk'        : 'user_psk_null'
     21 }
     22 
     23 with open('config.ini', 'w') as cf:
     24   config.write(cf)

     

    运行程序:

    pi@raspberrypi:~ $ python3 test_config_create_p3.py

    打开生成的配置文件config.ini:

    pi@raspberrypi:~ $ sudo nano config.ini

    sections和options的内容都是对的,只是section下的options的顺序与预期的不一致,不过这样也没什么问题。

    image

     

    • Python2

    ConfigParser库的首字母大写

    import ConfigParser

    config = ConfigParser.ConfigParser()

     

    python2中只能逐条添加section和option

    创建文件test_config_create_p2.py,复制下面的内容,保存退出

    pi@raspberrypi:~ $ sudo nano test_config_create_p2.py

      1 # -*- coding:utf-8 -*-
      2 import ConfigParser
      3 
      4 config = ConfigParser.ConfigParser()
      5 
      6 config.add_section("device")
      7 config.set("device", "type", 'NULL')
      8 config.set("device", "id",   '1')
      9 
     10 config.add_section("comn")
     11 config.set("comn", "protocol",   '0'   )
     12 config.set("comn", "lenth",      '400')
     13 config.set("comn", "filter_min", '50' )
     14 config.set("comn", "filter_max", '400' )
     15 
     16 config.add_section("wifi")
     17 config.set("wifi", "ssid", 'user_ssid_null')
     18 config.set("wifi", "psk",  'user_psk_null')
     19 
     20 with open('config.ini', 'w') as cf:
     21   config.write(cf)

     

    先删掉可能存在的config.ini文件

    pi@raspberrypi:~ $ rm -f config.ini

    运行程序:

    pi@raspberrypi:~ $ python2 test_config_create_p2.py

    打开生成的配置文件config.ini:

    pi@raspberrypi:~ $ sudo nano config.ini

    sections和options的内容都是对的,section下的options的顺序与预期的一致。

    image

     

    读取配置文件


    读取配置参数时,先确认section是否存在,如果不存在就添加section,并写入默认配置参数。

    这里使用的配置参数主要有两种类型:string和int,分别使用get(section, option)、getint(section, option)去读取参数。

    读取完成后把所有的items都打印出来。

      1 def GetConfig(filepath):
      2   global PRODUCT_TYPE
      3   global DEVICE_ID
      4 
      5   global PROTOCOL_TYPE
      6   global DB_PARAMS_LENGTH
      7   global COMN_FILTER_MIN
      8   global COMN_FILTER_MAX
      9 
     10   global WIFI_SSID
     11   global WIFI_PASSWORD
     12 
     13   is_new_section = False
     14 
     15   print('>> GetConfig()...')
     16   print(filepath)
     17 
     18   config = configparser.ConfigParser()
     19   config.read(filepath)
     20 
     21   if "wifi" not in config.sections():
     22     print('>> add config >> wifi...')
     23     is_new_section = True
     24     config.add_section("wifi")
     25     config.set("wifi", "ssid", WIFI_SSID)
     26     config.set("wifi", "psk", WIFI_PASSWORD)
     27   else:
     28     WIFI_SSID = config.get("wifi", "ssid")
     29     WIFI_PASSWORD = config.get("wifi", "psk")
     30 
     31   if "device" not in config.sections():
     32     print('>> add config >> device...')
     33     is_new_section = True
     34     config.add_section("device")
     35     config.set("device", "type", PRODUCT_TYPE)
     36     config.set("device", "id", str(DEVICE_ID))
     37   else:
     38     PRODUCT_TYPE = config.get("device", "type")
     39     DEVICE_ID    = config.getint("device", "id")
     40 
     41   if "comn" not in config.sections():
     42     print('>> add config >> comn...')
     43     is_new_section = True
     44     config.add_section("comn")
     45     config.set("comn", "protocol",   str(PROTOCOL_TYPE)   )
     46     config.set("comn", "lenth",      str(DB_PARAMS_LENGTH))
     47     config.set("comn", "filter_min", str(COMN_FILTER_MIN) )
     48     config.set("comn", "filter_max", str(COMN_FILTER_MAX) )
     49   else:
     50     PROTOCOL_TYPE    = config.get("comn", "protocol")
     51     DB_PARAMS_LENGTH = config.getint("comn", "lenth")
     52     COMN_FILTER_MIN  = config.getint("comn", "filter_min")
     53     COMN_FILTER_MAX  = config.getint("comn", "filter_max")
     54 
     55   print('>> list config items...')
     56   for sections in config.sections():
     57     for items in config.items(sections):
     58       print(items)
     59 
     60   if True == is_new_section:
     61     print('>> new section added, write to config file...')
     62     with open(filepath, 'w+') as cf:
     63       config.write(cf)

     

    修改配置文件


    set(section, option, value)来设置参数值,可以把所有参数值都用str()强制转换一下。

    写入之前先把所有的items都打印出来。

      1 def SetConfig(filepath):
      2   global WIFI_SSID
      3   global WIFI_PASSWORD
      4   global PRODUCT_TYPE
      5   global DEVICE_ID
      6   global PROTOCOL_TYPE
      7   global DB_PARAMS_LENGTH
      8   global COMN_FILTER_MIN
      9   global COMN_FILTER_MAX
     10 
     11   print('>> SetConfig()...')
     12   print(filepath)
     13 
     14   config = configparser.ConfigParser()
     15   config.read(CONFIG_FILE)
     16 
     17   if "device" not in config.sections():
     18     config.add_section("device")
     19   if "comn" not in config.sections():
     20     config.add_section("comn")
     21   if "wifi" not in config.sections():
     22     config.add_section("wifi")
     23 
     24   config.set("wifi", "ssid", str(WIFI_SSID))
     25   config.set("wifi", "psk",  str(WIFI_PASSWORD))
     26 
     27   config.set("device", "type", str(PRODUCT_TYPE))
     28   config.set("device", "id",   str(DEVICE_ID))
     29 
     30   config.set("comn", "protocol",   str(PROTOCOL_TYPE)   )
     31   config.set("comn", "lenth",      str(DB_PARAMS_LENGTH))
     32   config.set("comn", "filter_min", str(COMN_FILTER_MIN) )
     33   config.set("comn", "filter_max", str(COMN_FILTER_MAX) )
     34 
     35   print('>> list config items...')
     36   for sections in config.sections():
     37     for items in config.items(sections):
     38       print(items)
     39 
     40   print('>> write to config file...')
     41   with open(CONFIG_FILE, 'w+') as cf:
     42     config.write(cf)


    运行测试



    使用Python3进行测试(如果用Python2,只需要把库的首字母改成大写的)

    创建测试程序test_config.py。SetConfig()、GetConfig()参考上面,这里为了便于阅读省略了。
    pi@raspberrypi:~ $ sudo nano test_config.py

    这个测试函数里先是把默认的配置参数写入到配置文件并读取,然后再修改配置参数,重新写入到配置文件并读取。程序会打印即将写入配置文件的参数,还有从配置文件中读取到的参数。

      1 # -*- coding:utf-8 -*-
      2 import configparser
      3 
      4 CONFIG_FILE         = '/home/pi/config.ini'
      5 
      6 PRODUCT_TYPE        = 'NULL'
      7 DEVICE_ID           = 1
      8 PROTOCOL_TYPE       = 0
      9 DB_PARAMS_LENGTH    = 400
     10 COMN_FILTER_MIN     = 50
     11 COMN_FILTER_MAX     = 400
     12 WIFI_SSID           = 'user_ssid_null'
     13 WIFI_PASSWORD       = 'user_psk_null'
     14 
     15 #----
     16 def GetConfig(filepath):
     17   ####
     18 
     19 #----
     20 def SetConfig(filepath):
     21   ####
     22 
     23 #----
     24 def main():
     25   global CONFIG_FILE
     26 
     27   global WIFI_SSID
     28   global WIFI_PASSWORD
     29   global PRODUCT_TYPE
     30   global DEVICE_ID
     31   global PROTOCOL_TYPE
     32   global DB_PARAMS_LENGTH
     33   global COMN_FILTER_MIN
     34   global COMN_FILTER_MAX
     35 
     36   SetConfig(CONFIG_FILE)
     37   GetConfig(CONFIG_FILE)
     38 
     39   PRODUCT_TYPE        = 'ANOTHER_TYPE'
     40   DEVICE_ID           = 2
     41 
     42   PROTOCOL_TYPE       = 1
     43   DB_PARAMS_LENGTH    = 300
     44   COMN_FILTER_MIN     = 100
     45   COMN_FILTER_MAX     = 300
     46 
     47   WIFI_SSID           = 'another_user_ssid_null'
     48   WIFI_PASSWORD       = 'another_user_psk_null'
     49 
     50   SetConfig(CONFIG_FILE)
     51   GetConfig(CONFIG_FILE)
     52 
     53 if __name__ == '__main__':
     54   main()

     

    用Python3运行
    pi@raspberrypi:~ $ python3 test_config.py

    首先是写入默认配置参数并读取的结果,与预期一致:
    image

    之后是修改了配置参数,写入并读取的结果,与预期一致:
    image

  • 相关阅读:
    INSERT INTO ON DUPLICATE KEY UPDATE
    page to frame
    指定人提交
    在结构体嵌入接口
    排序 /src/sort/zfuncversion.go:136
    Modification should be made to copies of the returned MD.
    setTimeout 定时器的编号 实际延时比设定值更久的原因:最小延迟时间
    IOPS(Input/Output Operations Per Second)是一个用于计算机存储设备(如硬盘(HDD)、固态硬盘(SSD)或存储区域网络(SAN))性能测试的量测方式,可以视为是每秒的读写次数。和其他性能测试一样,存储设备制造商提出的IOPS不保证就是实际应用下的性能。
    Working Around Memory Leaks in Your Django Application
    celery 内存泄露
  • 原文地址:https://www.cnblogs.com/hotwater99/p/12758719.html
Copyright © 2020-2023  润新知