Python 读写配置文件模块: configobj 和 configParser

 

参考:http://www.voidspace.org.uk/python/configobj.html

Python模块之ConfigParser - 读写配置文件:http://www.cnblogs.com/victorwu/p/5762931.html

Python 官网 configparser 文档:https://docs.python.org/3.7/library/configparser.html

https://pymotw.com/2/ConfigParser/index.html

Python读写配置文件:https://blog.csdn.net/babyfish13/article/details/64919113

 

 

configobj 用法

 

读 配置文件

正常的读配置文件的方法是给 ConfigObj 一个文件名,然后通过字典来访问成员,子段也是一个字典

from configobj import ConfigObj
config = ConfigObj(filename)
#
value1 = config['keyword1']
value2 = config['keyword2']
#
section1 = config['section1']
value3 = section1['keyword3']
value4 = section1['keyword4']
#
# you could also write
value3 = config['section1']['keyword3']
value4 = config['section1']['keyword4']

示例:

初始化的 test.ini文件:

[server]
servername = 192.168.11.1
serverport = 8000[client_srv]
# 这里是注释
server = localhost
port = 8000

解析文件:

from configobj import ConfigObjconf_ini = "./test.ini"
config = ConfigObj(conf_ini, encoding='UTF8')# 读配置文件
print(config['server'])
print(config['server']['servername'])

运行结果:

 

创建 配置文件

这里演示一个创建空的 ConfigObj,然后设置文件名、值。最后写入文件

from configobj import ConfigObjconfig = ConfigObj()
config.filename = './write_config.ini'config['keyword1'] = 'value_1'
config['keyword2'] = 'value_2'config['section1'] = {}
config['section1']['keyword3'] = 'value_3'
config['section1']['keyword4'] = 'value_4'
#
section2 = {'keyword5': 'value_5','keyword6': 'value_6','sub-section': {'keyword7': 'value_7'}
}
config['section2'] = section2config['section3'] = {}
config['section3']['keyword 8'] = ['value_8', 'value_9', 'value_10']
config['section3']['keyword 9'] = ['value_11', 'value_12', 'value_13']
config.write()

运行结果:

 

修改 配置文件

from configobj import ConfigObj
#
conf_ini = "./test.ini"
config = ConfigObj(conf_ini,encoding='UTF8')
config['server']['servername'] = "127.0.0.1"
config.write()

运行结果:

添加 新项:

from configobj import ConfigObj
#
conf_ini = "./test.ini"
config = ConfigObj(conf_ini,encoding='UTF8')
config['new_items'] = {}
config['new_items']['Items1'] = "test items"
config.write()

运行结果:

 

删除项:

from configobj import ConfigObj
#
conf_ini = "./test.ini"
config = ConfigObj(conf_ini,encoding='UTF8')
del config['client_srv']['port']
config.write()

运行结果:

将配置文件写入到不同的文件:

from configobj import ConfigObj
#
conf_ini = "./test.ini"
config = ConfigObj(conf_ini,encoding='UTF8')
del config['client_srv']['port']
config.filename = "./test1.ini"
config.write()

 

 

 

configParser:Python 内置读取写入配置文件

 

configparser 模块 是 Python 内置的读取写入配置的模块。该模块支持读取类似如上格式的配置文件,如 windows 下的 .conf 及 .ini 文件等。

读配置文件

import ConfigParser
cf=ConfigParser.ConfigParser()cf.read(path)                      # 读配置文件(ini、conf)返回结果是列表
cf.sections()                      # 获取读到的所有sections(域),返回列表类型
cf.options('sectionname')          # 某个域下的所有key,返回列表类型
cf.items('sectionname')            # 某个域下的所有key,value对
value=cf.get('sectionname','key')  # 获取某个yu下的key对应的value值
cf.type(value)                     # 获取的value值的类型

函数说明:

  • (1)getint(section, option):获取section中option的值,返回int类型数据,所以该函数只能读取int类型的值。
  • (2)getboolean(section, option):获取section中option的值,返回布尔类型数据,所以该函数只能读取boolean类型的值。
  • (3)getfloat(section, option):获取section中option的值,返回浮点类型数据,所以该函数只能读取浮点类型的值。
  • (4)has_option(section, option):检测指定section下是否存在指定的option,如果存在返回True,否则返回False。
  • (5)has_section(section):检测配置文件中是否存在指定的section,如果存在返回True,否则返回False。

 

动态写配置文件

cf.add_section('test')                 # 添加一个域
cf.set('test3','key12','value12')  # 域下添加一个key value对
cf.write(open(path,'w'))             # 要使用'w'

 

使用示例

创建两个文件 test.config  及 test.ini  内容及示例截图如下:

[db]
db_port = 3306
db_user = root
db_host = 127.0.0.1
db_pass = xgmtest[concurrent]
processor = 20
thread = 10

 

基础读取配置文件

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

示例代码:

# -*- coding:utf-8 -*-import configparser
import osos.chdir("E:\\")cf = configparser.ConfigParser()  # 实例化 ConfigParser 对象# cf.read("test.ini")
cf.read("test.conf")     # 读取文件# return all section
secs = cf.sections()     # 获取sections,返回list
print('sections:', secs, type(secs))opts = cf.options("db")  # 获取db section下的 options,返回list
print('options:', opts, type(opts))# 获取db section 下的所有键值对,返回list 如下,每个list元素为键值对元组
kvs = cf.items("db")
print('db:', kvs)# read by type
db_host = cf.get("db", "db_host")
db_port = cf.getint("db", "db_port")
db_user = cf.get("db", "db_user")
db_pass = cf.get("db", "db_pass")# read int
threads = cf.getint("concurrent", "thread")
processors = cf.getint("concurrent", "processor")
print("db_host:", db_host)
print("db_port:", db_port)
print("db_user:", db_user)
print("db_pass:", db_pass)
print("thread:", threads)
print("processor:", processors)# 通常情况下,我们已知 section 及 option,需取出对应值,读取方式如下:
# cf.get(...) 返回的会是 str 类型, getint 则返回int类型
# read by type
db_host = cf.get("db", "db_host")
db_port = cf.getint("db", "db_port")
db_user = cf.get("db", "db_user")
db_pass = cf.get("db", "db_pass")

运行结果截图

 

基础写入配置文件

  • -write(fp)         将config对象写入至某个 .init 格式的文件  Write an .ini-format representation of the configuration state.
  • -add_section(section)                      添加一个新的section
  • -set( section, option, value              对section中的option进行设置,需要调用write将内容写入配置文件 ConfigParser2
  • -remove_section(section)                删除某个 section
  • -remove_option(section, option)    删除某个 section 下的 option

需要配合文件读写函数来写入文件,示例代码如下

import configparser
import osos.chdir("D:\\Python_config")cf = configparser.ConfigParser()# add section / set option & key
cf.add_section("test")
cf.set("test", "count", 1)
cf.add_section("test1")
cf.set("test1", "name", "aaa")# write to file
with open("test2.ini", "w+") as f:cf.write(f)

修改和写入类似,注意一定要先 read 原文件!

import configparser
import osos.chdir("D:\\Python_config")cf = configparser.ConfigParser()# modify cf, be sure to read!
cf.read("test2.ini")
cf.set("test", "count", 2)            # set to modify
cf.remove_option("test1", "name")# write to file
with open("test2.ini", "w+") as f:cf.write(f)

 

另一示例:
#test.cfg文件内容:
[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

读配置文件    

# -* - coding: UTF-8 -* -
import ConfigParser
#生成config对象
conf = ConfigParser.ConfigParser()
#用config对象读取配置文件
conf.read("test.cfg")
#以列表形式返回所有的section
sections = conf.sections()
print 'sections:', sections         #sections: ['sec_b', 'sec_a']
#得到指定section的所有option
options = conf.options("sec_a")
print 'options:', options           #options: ['a_key1', 'a_key2']
#得到指定section的所有键值对
kvs = conf.items("sec_a")
print 'sec_a:', kvs                 #sec_a: [('a_key1', '20'), ('a_key2', '10')]
#指定section,option读取值
str_val = conf.get("sec_a", "a_key1")
int_val = conf.getint("sec_a", "a_key2")print "value for sec_a's a_key1:", str_val   #value for sec_a's a_key1: 20
print "value for sec_a's a_key2:", int_val   #value for sec_a's a_key2: 10#写配置文件
#更新指定section,option的值
conf.set("sec_b", "b_key3", "new-$r")
#写入指定section增加新option和值
conf.set("sec_b", "b_newkey", "new-value")
#增加新的section
conf.add_section('a_new_section')
conf.set('a_new_section', 'new_key', 'new_value')
#写回配置文件
conf.write(open("test.cfg", "w"))

 

 

ConfigParser 的一些问题:

 

  • 1. 不能区分大小写。
  • 2. 重新写入的 ini 文件不能保留原有 INI 文件的注释。
  • 3. 重新写入的 ini文件不能保持原有的顺序。
  • 4. 不支持嵌套。
  • 5. 不支持格式校验。

示例代码:

import configparser# read data from conf file
cf = configparser.ConfigParser()
cf.read("biosver.cfg")# 返回所有的section
s = cf.sections()
print(s)# 返回information section下面的option
o1 = cf.options('Information')
print(o1)# 返回information section下面的option的具体的内容
v1 = cf.items("Information")
print(v1)# 得到指定项的值
name = cf.get('Information', 'name')
print(name)# 添加sectionif cf.has_section("del"):print("del section exists")
else:cf.add_section('del')cf.set("del", "age", "12")cf.write(open("biosver.cfg", "w"))# 删除option
if cf.has_option("del", 'age'):print("del->age exists")cf.remove_option("del", "age")cf.write(open("biosver.cfg", "w"))print("delete del->age")
else:print("del -> age don't exist")# 删除section
if cf.has_section("del1"):cf.remove_section("del1")cf.write(open("biosver.cfg", "w"))
else:print("del1 don't exists")# modify a value
cf.set("section", "option", "value")

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速排序(c++)

1、快速排序的思想 快速排序就是给基准数据找在数组中正确位置的过程,一旦基准位置的正确位置找到,那基准位置左右两边经过同样的步骤递归也可以有序,最终整体数组有序。 整体可以理解为三个步骤: 1、先从队尾开始向前扫描且当l …

设计模式之禅--思维导图

原图ProcessOn里搜索:设计模式之禅

有BRT,为啥还建公交港湾

原来快速公交和普通公交要一块儿跑历山路公交港湾示意图(制图:赵国陆)   “历山路上既然跑快速公交车,有BRT站台,还要公交港湾干吗?”21日,本报报道了新公交港湾将在历山路亮相的消息后,不少市…

2018展望| AI:巨头生态开始站队,深入垂直行业才能赚钱

来源:36氪“AI改变世界”这件事,在2018年会更值得人期待。不只是BAT,京东在谈智能仓储配送,滴滴在谈智慧交通……BAT,以及滴滴、京东这样的小巨头,手中攥着大量数据、也有直接服务消费者的场景,…

归并排序(c++)

归并排序 归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列&#x…

五大风口产业全景手绘图(新能源汽车、人工智能等)

来源:一览众车概要:五大风口产业全景手绘图(新能源汽车、人工智能等)一、新能源汽车二、人工智能三、住房租赁住房租赁产业蕴含着哪些发展机会?各参与方的竞争格局如何?未来人们租房会更便利吗?…

冒泡排序(c++)

冒泡排序(Bubble Sort) 是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复…

原型模式详解

PrototypeClass.java public class PrototypeClass implements Cloneable {Overridepublic PrototypeClass clone() {try {final PrototypeClass instance (PrototypeClass) super.clone();return instance;} catch (CloneNotSupportedException e) {return null;}} } 1、构…

选择排序(c++)

选择排序 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找…

人机交互与智能的思考

来源: 人机与认知实验室概要:在过去的20年里,人工智能一直专注于围绕建设智能体所产生的问题,即在特定的情境下,可以感知并行动的各种系统,在这种情况下,智能是一个与统计学,和经济学相关的理性概念。1.智能…

享元模式详解

SignInfo.java public class SignInfo {/*** 报名人员ID.*/private String id;/*** 考试地点.*/private String location;/*** 考试科目.*/private String subject;/*** 邮寄地址.*/private String postAddress;/*** 获取id.* return the id*/public String getId() {return i…

Python 多进程 multiprocessing 使用示例

multiprocessing 文档:https://docs.python.org/zh-cn/3.10/library/multiprocessing.html Process、Lock、Semaphore、Queue、Pipe、Pool:https://cuiqingcai.com/3335.html 把一个多线程改成多进程,主要有下面几种方法: subpro…

IDC:2018年中国制造业十大预测

来源:先进制造业概要:2017年,中国制造业的竞争日趋激烈。生产成本压力增大以及经济下行趋势迫使中国制造企业的两极分化更加严重。日前,IDC发布了《IDC FutureScape:全球制造业2018预测——中国启示》,报告…

插入排序(c++)

插入排序 插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿…

Python 操作 redis

官网命令(英文)列表:http://redis.io/commands Redis 教程:http://www.redis.net.cn/tutorial/3501.html Redis 命令参考:http://redisdoc.com/index.html Windows 中 redis 的下载及安装、设置:https://…

redis调优 -- 内存碎片

最近查看了一下redis运行状况,发现公司测试服务器的redis内存不太够用,但是实际占用内存的数据量其实不大,以前也没有这种情况,之前在cache层新增了一个防刷积分任务的逻辑才会这样,搜索一下原因,发现原来是…

2018 物联网产业分布展望:基础设施将到位

来源:36氪概要:在过去一年多的时间里,关于初创企业失败以及安全问题令人担忧等报道内容一直笼罩着物联网行业。在过去一年多的时间里,关于初创企业失败以及安全问题令人担忧等报道内容一直笼罩着物联网行业。但其实,物…

深入理解C# 3.x的新特性(2):Extension Method[下篇]

四、Extension Method的本质 通过上面一节的介绍,我们知道了在C#中如何去定义一个Extension Method:它是定义在一个Static class中的、第一个Parameter标记为this关键字的Static Method。在这一节中,我们来进一步认识Extension Method。 和C#…

解释器模式详解

Expression.java public interface Expression {// 解析公式和数值&#xff0c;其中var 中的key 值是公式中的参数&#xff0c;value 值是具体的数字.public int interpreter(final Map<String, Integer> var); } VarExpression.java public class VarExpression imp…

二分查找(c++)

二分查找 二分查找也称折半查找&#xff08;Binary Search&#xff09;&#xff0c;它是一种效率较高的查找方法。但是&#xff0c;折半查找要求线性表必须采用顺序存储结构&#xff0c;而且表中元素按关键字有序排列。它充分利用了元素间的次序关系&#xff0c;采用分治策略&a…