热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python教程分享python configparser中默认值的设定方式

目录configparser中默认值的设定解决方案使用configparser的注意事项注意要点configparser中默认值的设定在做某一个项目时,在读配置文件中,当出现配置文
目录
  • configparser中默认值的设定
    • 解决方案
  • 使用configparser的注意事项
    • 注意要点

configparser中默认值的设定

在做某一个项目时,在读配置文件中,当出现配置文件中没有对应项目时,如果要设置默认值,以前的做法是如下的:

try:      apple = config.get(section, 'apple')  except nosectionerror, nooptionerror:      apple = none

但当存在很多配置时,这种写法太糟糕

幸好,在configparser.get()函数中有一个vars()的参数,可以自定义;注:只能用configparser.configparser;rawconfigparser是不支持的

解决方案

1、定义函数:

class defaultoption(dict):      def __init__(self, config, section, **kv):          self._cOnfig= config          self._section = section          dict.__init__(self, **kv)      def items(self):          _items = []          for option in self:              if not self._config.has_option(self._section, option):                  _items.append((option, self[option]))              else:                  value_in_cOnfig= self._config.get(self._section, option)                  _items.append((option, value_in_config))          return _items

2、使用

def read_config(section, location):      cOnfig= configparser.configparser()      config.read(location)      apple = config.get(section, 'apple',                         vars=defaultoption(config, section, apple=none))      pear = config.get(section, 'pear',                        vars=defaultoption(config, section, pear=none))      banana = config.get(section, 'banana',                          vars=defaultoption(config, section, banana=none))      return apple, pear, banana

这样就很好解决了读取配置文件时没有option时自动取默认值,而不是用rasie的方式取默认值

此方案来之stackoverflow

使用configparser的注意事项

以这个非常简单的典型配置文件为例:

[default]  serveraliveinterval = 45  compression = yes  compressiOnlevel= 9  forwardx11 = yes  [bitbucket.org]  user = hg  [topsecret.server.com]  port = 50022  forwardx11 = no

1、config parser 操作跟dict 类似,在数据存取方法基本一致

>> import configparser  >>> cOnfig= configparser.configparser()  >>> config.sections()  []  >>> config.read('example.ini')  ['example.ini']  >>> config.sections()  ['bitbucket.org', 'topsecret.server.com']  >>> 'bitbucket.org' in config  true  >>> 'bytebong.com' in config  false  >>> config['bitbucket.org']['user']  'hg'  >>> config['default']['compression']  'yes'  >>> topsecret = config['topsecret.server.com']  >>> topsecret['forwardx11']  'no'  >>> topsecret['port']  '50022'  >>> for key in config['bitbucket.org']: print(key)  ...  user  compressionlevel  serveraliveinterval  compression  forwardx11  >>> config['bitbucket.org']['forwardx11']  'yes'

2、默认配置项[default]section 的默认参数会作用于其他sections

3、数据类型

  • config parsers 不会猜测或自动分析识别config.ini参数的数据类型,都会按照字符串类型存储,如果需要读取为其他数据类型,需要自定义转换。
  • 特殊bool值:对于常见的布尔值’yes’/‘no’, ‘on’/‘off’, ‘true’/‘false’ 和 ‘1’/‘0’,提供了getboolean()方法。

4、获取参数值方法 get()

  • 使用get()方法获取每一参数项的配置值。
  • 如果一般sections 中参数在[default]中也有设置,则get()到位[default]中的参数值。

5、参数分隔符可以使用‘=’或‘:’(默认)

6、可以使用‘#’或‘;’(默认)添加备注或说明 

[simple values]  key=value  spaces in keys=allowed  spaces in values=allowed as well  spaces around the delimiter = obviously  you can also use : to delimit keys from values  [all values are strings]  values like this: 1000000  or this: 3.14159265359  are they treated as numbers? : no  integers, floats and booleans are held as: strings  can use the api to get converted values directly: true  [multiline values]  chorus: i'm a lumberjack, and i'm okay      i sleep all night and i work all day  [no values]  key_without_value  empty string value here =  [you can use comments]  # like this  ; or this  # by default only in an empty line.  # inline comments can be harmful because they prevent users  # from using the delimiting characters as parts of values.  # that being said, this can be customized.      [sections can be indented]          can_values_be_as_well = true          does_that_mean_anything_special = false          purpose = formatting for readability          multiline_values = are              handled just fine as              long as they are indented              deeper than the first line              of a value          # did i mention we can indent comments, too?  

7、写配置

常见做法:

config.write(open('example.ini', 'w'))

合理做法:

with open('example.ini', 'w') as configfile:      config.write(configfile)

注意要点

1、configparser 在get 时会自动过滤掉‘#’或‘;‘注释的行(内容);

  • 一般情况下我们手工会把配置中的暂时不需要的用‘#‘注释,问题在于,configparser 在wirte的时候同file object行为一致,如果将注释’#‘的配置经过get后,再wirte到conf,那么’#‘的配置就会丢失。
  • 那么就需要一个策略或规则,配置需不需要手工编辑 ?还是建立复杂的对原生文本的处理的东西,我建议是管住手,避免将一些重要的配置爆露给用户编辑,切记行内注释和section内注释。
  • 有一个相对简单的方法是:
  • 对单独在一行的代码,你可以在读入前把"#", ";"换成其他字符如’@’,或‘^’(在其bat等其他语言中用的注释符易于理解),使用allow_no_value选项,这样注释会被当成配置保存下来,处理后你再把“#”, ";"换回来。

2、在configparser write之后,配置文本如果有大写字母’product’会变为小写字母’product’,并不影响配置的正确读写。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持<编程笔记>。

需要了解更多python教程分享python configparser中默认值的设定方式,都可以关注python教程分享栏目&#8212;编程笔记


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文整理了Java中org.dataconservancy.ui.model.DataItem.getFiles()方法的一些代码示例,展示了DataIte ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文整理了Java中io.netty.handler.codec.http.FullHttpRequest.content()方法的一些代码示例,展示了Fu ... [详细]
  • 本文整理了Java中org.assertj.core.api.AbstractPathAssert.existsNoFollowLinks()方法的一些代码示例,展示了 ... [详细]
author-avatar
天亮说晚安
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有