Python ConfigParser的使用

1.基本的读取配置文件

-read(filename) 直接读取ini文件内容
-sections() 得到所有的section,并以列表的形式返回
-options(section) 得到该section的所有option
-items(section) 得到该section的所有键值对
-get(section,option) 得到section中option的值,返回为string类型
-getint(section,option) 得到section中option的值,返回为int类型,还有相应的getboolean()和getfloat() 函数。

2.基本的写入配置文件
-add_section(section) 添加一个新的section
-set( section, option, value) 对section中的option进行设置,需要调用write将内容写入配置文件。

3.基本例子

test.conf

[sec_a] 
a_key1 = 20 
a_key2 = 10 

[sec_b] 
b_key1 = 121 
b_key2 = b_value2 
b_key3 = $r 
b_key4 = 127.0.0.1 
parse_test_conf.py

test.py

import ConfigParser 

cf = ConfigParser.ConfigParser() 

#read config
cf.read("test.conf") 

# return all section
secs = cf.sections() 
print 'sections:', secs 

opts = cf.options("sec_a") 
print 'options:', opts 

kvs = cf.items("sec_a") 
print 'sec_a:', kvs 

#read by type
str_val = cf.get("sec_a", "a_key1") 
int_val = cf.getint("sec_a", "a_key2") 

print "value for sec_a's a_key1:", str_val 
print "value for sec_a's a_key2:", int_val 

#write config
#update value
cf.set("sec_b", "b_key3", "new-$r") 
#set a new value
cf.set("sec_b", "b_newkey", "new-value") 
#create a new section
cf.add_section('a_new_section') 
cf.set('a_new_section', 'new_key', 'new_value') 

#write back to configure file
cf.write(open("test.conf", "w")) 

得到终端输出:

sections: ['sec_b', 'sec_a'] 
options: ['a_key1', 'a_key2'] 
sec_a: [('a_key1', "i'm value"), ('a_key2', '22')] 
value for sec_a's a_key1: i'm value 
value for sec_a's a_key2: 22 

更新后的test.conf

[sec_b] 
b_newkey = new-value 
b_key4 = 127.0.0.1 
b_key1 = 121 
b_key2 = b_value2 
b_key3 = new-$r 

[sec_a] 
a_key1 = i'm value 
a_key2 = 22 

[a_new_section] 
new_key = new_value

4.Python的ConfigParser Module中定义了3个类对INI文件进行操作。分别是RawConfigParser、ConfigParser、SafeConfigParser。RawCnfigParser是最基础的INI文件读取类,ConfigParser、SafeConfigParser支持对%(value)s变量的解析。

设定配置文件test2.conf

[portal] 
url = http://%(host)s:%(port)s/Portal 
host = localhost 
port = 8080 

使用RawConfigParser:

import ConfigParser 

cf = ConfigParser.RawConfigParser() 

print "use RawConfigParser() read"
cf.read("test2.conf") 
print cf.get("portal", "url") 

print "use RawConfigParser() write"
cf.set("portal", "url2", "%(host)s:%(port)s") 
print cf.get("portal", "url2") 

得到终端输出:

use RawConfigParser() read 
http://%(host)s:%(port)s/Portal 
use RawConfigParser() write 
%(host)s:%(port)s

改用ConfigParser:

import ConfigParser 

cf = ConfigParser.ConfigParser() 

print "use ConfigParser() read"
cf.read("test2.conf") 
print cf.get("portal", "url") 

print "use ConfigParser() write"
cf.set("portal", "url2", "%(host)s:%(port)s") 
print cf.get("portal", "url2") 

得到终端输出

use ConfigParser() read 
http://localhost:8080/Portal 
use ConfigParser() write 
localhost:8080

改用改用SafeConfigParser:

import ConfigParser 

cf = ConfigParser.SafeConfigParser() 

print "use SafeConfigParser() read"
cf.read("test2.conf") 
print cf.get("portal", "url") 

print "use SateConfigParser() write"
cf.set("portal", "url2", "%(host)s:%(port)s") 
print cf.get("portal", "url2")

得到终端输出(效果同ConfigParser):

use SafeConfigParser() read 
http://localhost:8080/Portal 
use SateConfigParser() write 
localhost:8080 

解析时出现”ConfigParser contains no section headers”的错误

使用ConfigParser解析配置文件时,要求文件中所有的内容都是按sections和items的方式组织的。 如果有些配置文件的部分配置项不属于任何Sections,例如:

cat /etc/rsyncd.conf 
list = no
log file=/var/log/rsyncd.log
max  connections=200
hosts allow = 10.0.0.0/8 172.16.0.0/12

[test]
path=/data0/www/test./public_html
auth users = internal_vdun 
hosts allow = 127.0.0.1 192.168.1.0/24
secrets file = /etc/rsync.secrets
read only = no 
list = no 
uid = root
gid = root

这时再用ConfigParser去处理时就会报以下错误:

python test_config.py 
Traceback (most recent call last):
  File "test_config.py", line 26, in <module>
    rsync = Rsync()
  File "test_config.py", line 19, in __init__
    raise e
ConfigParser.MissingSectionHeaderError: File contains no section headers.
file: /etc/rsyncd.conf, line: 1
'list = no\n'

解决方法
用StringIO对象给配置文件临时加个section,然后用ConfigParser.ConfigParser.readfp()方法打开StringIO对象既可,如下代码所示:

 # -*- coding:utf-8 -*-
from io import StringIO
from ConfigParser import ConfigParser

class Rsync(object):
    def __init__(self, rsync_config_file='/etc/rsyncd.conf'):
        self.rsync_config_file = rsync_config_file
        self.parser = ConfigParser()

        try:
            self.rsync_config = StringIO('[Rsync_Config]\n%s' % (open(self.rsync_config_file).read()))
            self.parser.readfp(self.rsync_config)

        except Exception as e:
            raise e

    def audit(self):
        for section in self.parser.sections():
            print self.parser.items(section)

if __name__ == '__main__':
    rsync = Rsync()
    rsync.audit()

转载自netxfly的博客

configparser模块是一个用于读取和写入配置文件的Python标准模块。配置文件通常是用于存储应用程序的设置和配置信息的文件。下面是使用configparser模块的基本步骤: 1. 导入configparser模块: ```python import configparser ``` 2. 创建一个ConfigParser对象: ```python config = configparser.ConfigParser() ``` 3. 读取配置文件: ```python config.read('config.ini') ``` 4. 获取配置项的值: ```python value = config.get('section', 'option') ``` 其中,section是配置文件中的一个段落,option是段落中的一个选项。例如,在以下配置文件中: ``` [database] host = localhost port = 3306 user = root password = test123 database = testdb ``` 要获取host的值,可以使用以下代码: ```python host = config.get('database', 'host') print(host) # 输出:localhost ``` 5. 修改配置项的值: ```python config.set('section', 'option', 'new_value') ``` 例如,要将host修改为127.0.0.1,可以使用以下代码: ```python config.set('database', 'host', '127.0.0.1') ``` 6. 写入配置文件: ```python with open('config.ini', 'w') as f: config.write(f) ``` 完整示例: ```python import configparser config = configparser.ConfigParser() # 读取配置文件 config.read('config.ini') # 获取配置项的值 host = config.get('database', 'host') port = config.getint('database', 'port') user = config.get('database', 'user') password = config.get('database', 'password') database = config.get('database', 'database') print('host:', host) print('port:', port) print('user:', user) print('password:', password) print('database:', database) # 修改配置项的值 config.set('database', 'host', '127.0.0.1') # 写入配置文件 with open('config.ini', 'w') as f: config.write(f) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值