configparser模块

config:配置,parser:解析。字面意思理解configparser模块就是配置文件的解析模块。

来看一个好多软件的常见文档格式如下:

[DEFAULT]                              # 标题性的东西,
# 下面四组键值对是关于[DEFAULT]的介绍
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes [bitbucket.org]
User = hg [topsecret.server.com]
Port = 50022
ForwardX11 = no
  • 用Python生成配置文件

  如果想用python生成一个这样的文档怎么做呢?

import configparser

config = configparser.ConfigParser()   # 实例出来一个对象,相当于创建了一个空字典config={}

# ["DEFAULT"] 相当于字典config的键,{}里的内容是键["DEFAULT"]的值。
config["DEFAULT"] = {'ServerAliveInterval': '',
'Compression': 'yes',
'CompressionLevel': ''} # 把写好的对象写到一个文件里
# 把句柄configfile作为内容写入到xample.ini文件里。
with open('example.ini', 'w') as configfile:
config.write(configfile) # 通过config对象,调用write方法,把句柄configfile写入到example.ini文件里。 执行后example.ini文件的内容如下:

文件内容与最开始的文件结构一致了,这样一个简单的配置文件就通过Python生成好了。

再来通过Python给生成还有更多块的配置文件

import configparser

config = configparser.ConfigParser()   # 实例出来一个对象,相当于创建了一个空字典config={}

# ["DEFAULT"] 相当于字典config的键,{}里的内容是键["DEFAULT"]的值。
# 相当于创建了一个[DEFAULT]块(指的是在配置文件里的块哦)
config["DEFAULT"] = {'ServerAliveInterval': '',
'Compression': 'yes',
'CompressionLevel': ''}
config['DEFAULT']['ForwardX11'] = 'yes' # 也可以这样给字典里新增键值对 # 这个写法虽然与上面不一样,但是原理是一样的
# 首先config的键['bitbucket.org'] 对应一个空字典{}
# 这就相当于又创建了一个块[bitbucket.org](在配置文件里哦)
config['bitbucket.org'] = {}
# 给空字典{}里增加了一个键值对
config['bitbucket.org']['User'] = 'hg' # 同理又创建了一个块[topsecret.server.com]
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
# 然后空字典{}里给它填值
topsecret['Host Port'] = '' # mutates the parser
topsecret['ForwardX11'] = 'no' # same here # 把写好的对象写到一个文件里
# 把句柄configfile作为内容写入到xample.ini文件里。
with open('example.ini', 'w') as configfile:
config.write(configfile) # 通过config对象,调用write方法,把句柄configfile写入到example.ini文件里。 生成后的配置文件内容
# 无注释版代码
import configparser config = configparser.ConfigParser() config["DEFAULT"] = {'ServerAliveInterval': '',
'Compression': 'yes',
'CompressionLevel': ''}
config['DEFAULT']['ForwardX11'] = 'yes' config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg' config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = ''
topsecret['ForwardX11'] = 'no' with open('example.ini', 'w') as configfile:
config.write(configfile)
  • 处理配置文件

  配置文件生成了,那如何使用呢?一般对文件的使用或处理就是增、删、改、查,来看看吧!

import configparser

# 1. 不管是生成文件还是处理文件,都得先通过configparser.ConfigParser()生成一个对象config
config = configparser.ConfigParser() # 2. 生成的对象要跟将要处理的文件进行关联后,才能处理
config.read("example.ini") # 一. 查
#
# 1. 可以查出有哪些块名
print(config.sections()) # ['bitbucket.org', 'topsecret.server.com']
'''
1. sections是块的意思;
2. 只会打印出[DEFAULT]以外的块名
3. 得到块名,就可以进行判断操作
'''
# 比如,可以判断用户输入的那部分有没有在配置文件里。
# 直接判断是不是在config,其实也是判断是否在sections里,所以下面两个写法效果一样。
print("bytebong.com" in config) # False
print("bytebong.com" in config.sections()) # False
print("bitbucket.org" in config) # True 判断块名是否在config # 2. 可以查出块下有什么键值对
# 注意,这个查询不区分大小写哦,配置文件里是小写,这里写大写的USER,照样可以取到正确的值
print(config["bitbucket.org"]["USER"]) # hg # 3. 查询DEFAULT下面某个键的值
print(config['DEFAULT']['serveraliveinterval']) # # 4. 既然是一个字典,当然也可以进行遍历 for key in config['topsecret.server.com']:
print(key) # 结果
# host port
# forwardx11
# serveraliveinterval
# compression
# compressionlevel
'''
注意,这里有个问题,遍历的只是[topsecret.server.com]块下的键,为什么[DEFAULT]下面的键也出来了呢?
[答] 这就是[DEFAULT]的一个特点,不管你遍历谁,它都会跟着被遍历出来。 那如果你说,那我不想遍历出[DEFAULT]的内容怎么办?
[答] 不想遍历出,那你就别用[DEFAULT]命名,[DEFAULT]就是这么关键。 [DEFAULT]的作用: 是文件信息,无论你用到那一部分,[DEFAULT]都必须需要跟着出现的配置信息,是非有不可的场景。 举例:
[DEFAULT]就相当于一个公用的,比如你想给客户展示的所有信息,都必须带着公司的名字,这些所有信息可能存在于不同的
配置文件,或者块下面,既然都得带着公司名字,就没必要每个配置文件或者块都写一遍, 就可以把公司信息提出了单独写在
[DEFAULT]里,这样无论什么时候都可以取到公司名字了。
''' # 4. options():提取出配置文件里块名下的键,然后把结果放在列表里。
# 上面遍历取到的结果都是单独的显示在一行上
print(config.options("topsecret.server.com"))
# ['host port', 'forwardx11', 'serveraliveinterval', 'compression', 'compressionlevel']' # 5. items():把取到的键和值结果组成一个元组显示
print(config.items("bitbucket.org"))
# [('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')] # 6. get(): 连续去去值的功能
print(config.get("bitbucket.org", "compressionlevel"))
#
'''
get()方法的工作原理:
第一步:先得到"bitbucket.org"下的值,它的值是一个字典A
第二步:再取这个字典A里的值 注意,从文件里看,bitbucket.org下面只有一个字典,键值对是user = hg,为什么这里可以取到compressionlevel的值呢?
[答] 这个其实上面已经说过了, 因为compressionlevel是在[DEFAULT]下面的,所以无论在其他哪个块下,都可以提取到[DEFAULT]
下的信息
'''

上面的查操作仅仅是从配置文件里查询内容,没有对文件进行任何修改,而下面介绍的增,删,改都对文件进行了修改,所以操作完成后,都有一个共同的

语句,必须把最终结果写入配置文件

    • 增  
import configparser

config = configparser.ConfigParser()
config.read("example.ini") # 1. add_section():增加一个块
config.add_section("yuan")
config.write(open("i.cfg", 'w'))
'''
上面先从config里读取了文件
下面再增加一个块并写进了一个新的文件
所以,新的文件i.cfg里有四个块
'''
# 2. set(): 给块下面增加值

import configparser

config = configparser.ConfigParser()
config.read("example.ini")
config.add_section("yuan") # 给块里加值
# 第一个参数是块; 第二个参数是块下面的键; 第三个参数是键对应的值
config.set("yuan","key1","value1")
config.set("yuan","key2","value2") config.write(open("i.cfg", 'w'))

    • 删  
上面已经生成了i.cfg文件,就直接用它吧

import configparser

config = configparser.ConfigParser()
config.read("i.cfg") # 1. remove_section(): 删除块
config.remove_section("topsecret.server.com") # 会把该块下的内容全部删除 # 2. 删除块下的键值对
config.remove_option("yuan", "key1") config.write(open("i.cfg", 'w'))

小技巧

config.write(open("i.cfg", 'w'))
这里的open()没有让它等于一个文件句柄 f,所以是不需要进行close的。 建议以后都这样写,这种写法非常好的。 直接在一个方法里面写个open()代替f的话,是不需要对它进行close的。
# 修改其实就是set()方法实现

# set可以新增键值对,也可以更新键值对的值
import configparser config = configparser.ConfigParser()
config.read("i.cfg") config.set("yuan","key2","value3")
config.write(open("i.cfg", 'w'))

第二十四篇configparser(**)的更多相关文章

  1. SpringBoot第二十四篇:应用监控之Admin

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11457867.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   前一章(S ...

  2. Android UI开发第二十四篇——Action Bar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  3. 【转】Android UI开发第二十四篇——Action Bar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  4. Python之路【第二十四篇】Python算法排序一

    什么是算法 1.什么是算法 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出.简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果. ...

  5. 第二十四篇-用VideoView制作一个简单的视频播放器

    使用VideoView播放视频,视频路径有三种: 1. SD卡中 2. Android的资源文件中 3. 网络视频 第一种,SD卡中的方法. 路径写绝对路径,如果不能播放,可以赋予读取权限. 效果图: ...

  6. 第二十四篇 -- Cache学习

    Cache存储器 电脑中为高速缓冲存储器,是位于CPU和主存储器DRAM(Dynamic Random Access Memory)之间,规模较小,但速度很高的存储器,通常由SRAM(Static R ...

  7. 第二十四篇:导出SOUI对象到LUA脚本

    LUA是一种体积小,速度快的脚本语言.脚本语言虽然性能上和C++这样的Naitive语言相比差一点,但是开发速度快,可以方便的更新代码等,近年来受到了越来越多开发者的重视. 在SOUI框架中,我把脚本 ...

  8. Python之路(第二十四篇) 面向对象初级:多态、封装

    一.多态 多态 多态:一类事物有多种形态,同一种事物的多种形态,动物分为鸡类,猪类.狗类 例子 import abc class H2o(metaclass=abc.ABCMeta): ​ def _ ...

  9. (转) SpringBoot非官方教程 | 第二十四篇: springboot整合docker

    这篇文篇介绍,怎么为 springboot程序构建一个Docker镜像.docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的 ...

随机推荐

  1. idea原生ajax数据处理(增删改查)

    项目名称:Bookstore UI界面 项目文件 操作: jsp代码 <%@ page import="dao.BookDAO" %> <%@ page impo ...

  2. Android学习笔记_32_通过WebView实现JS代码与Java代码互相通信

    webview两种实现方法,覆盖onKeyDown()方法 缓存 WebSettings应用注意的几个问题 1.要实现JS代码与Java代码互相通信,需要通过Android的WebView控件,在视图 ...

  3. 如何确定VS编译器版本

    _MSC_VER是MSVC编译器的内置宏,定义了编译器的版本,_MSC_VER 值对应版本关系 MSVC++ 11.0 _MSC_VER = 1700 (Visual Studio 2012)  MS ...

  4. java中String、包装类、枚举类的引用传递

    一般情况下,我们认为Java中了除了八种基本数据类型,其他都是对象,进行引用传递: 但是:String.包装类.枚举类作为参数传递后发现,没有达到引用传递的效果,很多人认为它是值传递! 首先,对象肯定 ...

  5. AngularJS 三 控制器和事件

    AngularJS控制器: ngularJS中的控制器是一个使用 $ scope 对象维护应用程序数据和行为的JavaScript函数. 您可以将属性和方法附加到控制器函数内的 $ scope  对象 ...

  6. 学习Node.js知识小结

    什么是Node.js 官方解释:Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js使用了一个事件驱动.非阻塞式I/O的模型( Node.js的特性 ...

  7. Angular将填入表单的数据渲染到表格

    一.项目简介 我们将采用Angular框架来做一个demo,这个demo将要实现的功能如下: 在X坐标和Y坐标文本框输入信息,然后点击添加,就会在下面表格 中出现一项相应的数据,点击每一项旁边的删除按 ...

  8. 一个logstash引发的连环案,关于logstash提示:Reached open files limit: 4095, set by the 'max_open_files' option or default, files yet to open: 375248

    不多说,直接上问题.版本logstash-2.4.0,启动后提示错误: !!! Please upgrade your java version, the current version '1.7.0 ...

  9. django-orm简记

    首先orm是什么? orm-------->对象关系映射 专业性解释网上一大推,随便搜搜就能了解大概.在我理解(通俗):一个类 ----- 数据库中一张表 类属性 ----- 数据表中的字段名 ...

  10. aes 加密,解密(2)

    JavaScript加密,解密 1,此为AES加密后,转换为16进制编码 var encodePwd = function (data,key){ var keyHex = CryptoJS.enc. ...