python的ConfigParser模块 末蓝、 2021-09-16 06:34 435阅读 0赞 ### **简介** ### `ConfigParser`模块在python3中修改为`configparser`.这个模块定义了一个ConfigParser类,该类的作用是使用配置文件生效,配置文件的格式和windows的INI文件的格式相同 该模块的作用 就是使用模块中的`RawConfigParser()`、`ConfigParser()`、 `SafeConfigParser()`这三个方法[(三者择其一)][Link 1],创建一个对象使用对象的方法对指定的配置文件做增删改查 操作。 配置文件有不同的片段组成和Linux中repo文件中的格式类似: **格式:** [section] name=value 或者 name: value "#" 和";" 表示注释 [DEFAULT] #设置默认的变量值,初始化 [My Section] foodir: %(dir)s/whatever dir=frob long: this value continues in the next line `%(dir)s` 会被`frob`代替。默认值会以字典的形式传递给ConfigParser的构造器。section一般存放的哦内置目录下,如果切换到其他的目录需啊哟指定存放位置。 ### **方法** ### 下面这三种方式使用时,切记注意 在调用这三个函数时,切记这三个函数会将调用`optionxform()`,在传递键值对数据时,会将键名 全部转化为小写。 **RawConfigParser()** ConfigParser.RawConfigParser([defaults[, dict_type[, allow_no_value]]]) defaults : 如果指定默认值,则使用默认值的键值对 dict_type:使用新的section的键值对 allow_no_value :默认是False,如果是True,表示可以接收空值(None) return:对象 不支持可变参数,在section中不能存在`%()s` **ConfigParser()** ConfigParser.ConfigParser([defaults[, dict_type[, allow_no_value]]]) 在default中必须出现`%()s` **SafeConfigParser()** ConfigParser.SafeConfigParser([defaults[, dict_type[, allow_no_value]]]) 更加智能化,在section中是否存在`%()s`会自动判断 传递参数使用函数optionxform(),foo %(bar)s 和 foo %(BAR)s是相同的,optionxform()会将大写字母全部转换为小写。 ### **常见异常** ### <table> <thead> <tr> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">异常</th> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">描述</th> </tr> </thead> <tbody> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">ConfigParser.Error</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">所有异常的基类</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">ConfigParser.NoSectionError</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">指定的section没有找到</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">ConfigParser.DuplicateSectionError</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">调用add_section() 时,section名称已经被使用</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">ConfigParser.NoOptionError</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">指定的参数没有找到</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">ConfigParser.InterpolationError</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">当执行字符串插值时出现问题时,出现异常的基类</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">ConfigParser.InterpolationDepthError</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">当字符串插值无法完成时,因为迭代次数超过了最大的范围,所以无法完成。InterpolationError的子类</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">InterpolationMissingOptionError</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">当引用的选项不存在时,会出现异常。InterpolationError的子类</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">ConfigParser.InterpolationSyntaxError</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">当产生替换的源文本不符合所需的语法时,就会出现异常。InterpolationError的子类。</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">ConfigParser.MissingSectionHeaderError</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">当试图解析一个没有分段标题的文件时,会出现异常。</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">ConfigParser.ParsingError</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">当试图解析文件时发生错误时,会出现异常</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">ConfigParser.MAX_INTERPOLATION_DEPTH</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">当raw参数为false时,get()的递归插值的最大深度。这只适用于ConfigParser类</span></td> </tr> </tbody> </table> ### **RawConfigParser 对象** ### 对象的操作可以分为两大类,一种是对配置文件的操作,另一种是对读取后数据流的操作。 **对配置文件的操作** 读取配置文件 <table> <thead> <tr> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">方法</th> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">描述</th> </tr> </thead> <tbody> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">read(filenames)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">filesnames是一个列表,需要从文件加载初始值的应用程序应该在调用read()之前使用readfp()加载所需的文件或文件。</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">readfp(fp[, filename])</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">在fp中,从文件或文件类对象中读取和解析配置数据(只使用readline()方法)。如果文件名被省略,并且fp有一个name属性,它被用于文件名;默认值为< ? >。</span></td> </tr> </tbody> </table> 写入配置文件 <table> <thead> <tr> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">方法</th> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">描述</th> </tr> </thead> <tbody> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">write(fileobject)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">将配置的表示写入指定的文件对象。这个表示可以由未来的read()调用解析。</span></td> </tr> </tbody> </table> **对内存中数据流的操作** 增加配置文件中的值 <table> <thead> <tr> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">方法</th> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">描述</th> </tr> </thead> <tbody> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">add_section(section)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">向实例添加一个section</span></td> </tr> </tbody> </table> 删除配置文件中的值 <table> <thead> <tr> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">方法</th> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">描述</th> </tr> </thead> <tbody> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">remove_option(section, option)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">从指定的部分中删除指定的选项。如果该部分不存在,请提出NoSectionError。如果存在的选项被删除,返回True;否则返回False。</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">remove_section(section)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">从配置中删除指定的section。如果这个部分确实存在,返回True。否则返回假</span></td> </tr> </tbody> </table> 修改配置文件中的值 <table> <thead> <tr> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">方法</th> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">描述</th> </tr> </thead> <tbody> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">set(section, option, value)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">如果给定的部分存在,将给定的选项设置为指定的值</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">optionxform(option)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">也可以在一个实例上重新设置它,对于一个需要字符串参数的函数。例如,将其设置为str,将使选项名称区分大小写</span></td> </tr> </tbody> </table> 查找配置文件中的值 <table> <thead> <tr> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">方法</th> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">描述</th> </tr> </thead> <tbody> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">defaults()</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">返回包含实例范围默认值的字典。</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">sections()</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">返回可用的section的列表;默认section不包括在列表中</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">has_section(section)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">指示指定的section是否出现在配置中。默认的section未被确认</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">options(section)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">返回指定section中可用的选项列表。</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">has_option(section, option)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">如果给定的section存在,并且包含给定的选项,则返回True;否则返回False</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">get(section, option)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">为指定的section获取一个选项值。</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">getint(section, option)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">它将指定section中的选项强制转换为整数</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">getfloat(section, option)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">它将指定section中的选项强制转换为浮点型</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">getboolean(section, option)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">强制转换为布尔型,”1”, “yes”, “true”, and “on”, 转换为True,”0”, “no”, “false”, and “off”, 转换为Falseo 其他返回ValueError.</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">items(section)</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">返回给定section中每个选项的(name,value)对的列表。</span></td> </tr> </tbody> </table> import ConfigParser, os config = ConfigParser.ConfigParser() config.readfp(open('defaults.cfg')) config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')]) * cfgparser = ConfigParser() ... cfgparser.optionxform = str ### **ConfigParser对象** ### SafeConfigParser中包含ConfigParser相同的方法,还有一部分增加的方法 <table> <thead> <tr> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">方法</th> <th style="background-color:#eff3f5;text-align:left;vertical-align:middle;">描述</th> </tr> </thead> <tbody> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">get(section, option[, raw[, vars]])</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">为指定的section获取一个选项值。如果提供了vars,它必须是一个字典。该选项在vars(如果提供)、分段和默认值中查找,</span></td> </tr> <tr> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">items(section[, raw[, vars]])</span></td> <td style="background-color:#ffffff;border-color:#dddddd;text-align:left;vertical-align:middle;"><span style="color:#4f4f4f;">返回给定section中每个选项的(名称、值)对的列表</span></td> </tr> </tbody> </table> 所有的“%”插值都在返回值中展开,除非原始的参数是真的。内插键的值与选项相同 ### **SafeConfigParser对象** ### `set(section, option, value)` 如果给定的部分存在,将给定的选项设置为指定的值;否则提高NoSectionError。值必须是字符串(str或unicode);如果没有,则会出现类型错误 ### **实例** ### **实例一:写配置文件** import ConfigParser config = ConfigParser.RawConfigParser() # When adding sections or items, add them in the reverse order of # how you want them to be displayed in the actual file. # In addition, please note that using RawConfigParser's and the raw # mode of ConfigParser's respective set functions, you can assign # non-string values to keys internally, but will receive an error # when attempting to write to a file or when you get it in non-raw # mode. SafeConfigParser does not allow such assignments to take place. config.add_section('Section1') config.set('Section1', 'an_int', '15') config.set('Section1', 'a_bool', 'true') config.set('Section1', 'a_float', '3.1415') config.set('Section1', 'baz', 'fun') config.set('Section1', 'bar', 'Python') config.set('Section1', 'foo', '%(bar)s is %(baz)s!') # Writing our configuration file to 'example.cfg' with open('example.cfg', 'wb') as configfile: config.write(configfile) **实例二:读配置文件** import ConfigParser config = ConfigParser.RawConfigParser() config.read('example.cfg') # getfloat() raises an exception if the value is not a float # getint() and getboolean() also do this for their respective types a_float = config.getfloat('Section1', 'a_float') an_int = config.getint('Section1', 'an_int') print a_float + an_int # Notice that the next output does not interpolate '%(bar)s' or '%(baz)s'. # This is because we are using a RawConfigParser(). if config.getboolean('Section1', 'a_bool'): print config.get('Section1', 'foo') * **实例三:获取插入值** import ConfigParser config = ConfigParser.ConfigParser() config.read('example.cfg') # Set the third, optional argument of get to 1 if you wish to use raw mode. print config.get('Section1', 'foo', 0) # -> "Python is fun!" print config.get('Section1', 'foo', 1) # -> "%(bar)s is %(baz)s!" # The optional fourth argument is a dict with members that will take # precedence in interpolation. print config.get('Section1', 'foo', 0, {'bar': 'Documentation', 'baz': 'evil'}) **实例四:默认值** 所有三种类型的config分析器都可以使用默认值。如果在其他地方没有定义一个选项,那么它们就被用于插值 import ConfigParser # New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each config = ConfigParser.SafeConfigParser({'bar': 'Life', 'baz': 'hard'}) config.read('example.cfg') print config.get('Section1', 'foo') # -> "Python is fun!" config.remove_option('Section1', 'bar') config.remove_option('Section1', 'baz') print config.get('Section1', 'foo') # -> "Life is hard!" **实例五:在各section之间移动选** def opt_move(config, section1, section2, option): try: config.set(section2, option, config.get(section1, option, 1)) except ConfigParser.NoSectionError: # Create non-existent section config.add_section(section2) opt_move(config, section1, section2, option) else: config.remove_option(section1, option) **实例六:配置文件中有空值** 一些配置文件包含了没有值的设置,但是它与ConfigParser支持的语法相一致。对构造函数的不允许值参数可以被用来表示应该接受这样的值 >>> import ConfigParser >>> import io >>> sample_config = """ ... [mysqld] ... user = mysql ... pid-file = /var/run/mysqld/mysqld.pid ... skip-external-locking ... old_passwords = 1 ... skip-bdb ... skip-innodb ... """ >>> config = ConfigParser.RawConfigParser(allow_no_value=True) >>> config.readfp(io.BytesIO(sample_config)) >>> # Settings with values are treated as before: >>> config.get("mysqld", "user") 'mysql' >>> # Settings without values provide None: >>> config.get("mysqld", "skip-bdb") >>> # Settings which aren't specified still raise an error: >>> config.get("mysqld", "does-not-exist") Traceback (most recent call last): ... ConfigParser.NoOptionError: No option 'does-not-exist' in section: 'mysqld' 转自:[https://blog.csdn.net/miner\_k/article/details/77857292][Link 1] [Link 1]: https://blog.csdn.net/miner_k/article/details/77857292
还没有评论,来说两句吧...