python里面需要使用到configparser
包,可以使用pip安装
pip install configparser
在配置文件里面,默认使用[ ]
表示section,如下config.ini
文件表示有两个节:
[user1]
user_ip = 127.0.0.1
user_name = testuser1
user_id = 45
[user2]
user_ip = 127.0.0.2
user_name = testuser2
user_id = 41
下面代码有注释,关于使用os写相对路径,可以看参考文献【1】
import configparser
cf = configparser.ConfigParser()
cf.read("config.ini") # 读取配置文件,如果写文件的绝对路径,就可以不用os模块
secs = cf.sections() # 获取文件中所有的section(一个配置文件中可以有多个配置,如数据库相关的配置,邮箱相关的配置,
# 每个section由[]包裹,即[section]),并以列表的形式返回
print(secs)
options = cf.options("user1") # 获取某个section名为user1所对应的键
print(options)
items = cf.items("user1") # 获取section名为user1所对应的全部键值对
print(items)
name = cf.get("user1", "user_name") # 获取user1中user_name对应的值
print(name)
已知原始config.ini
文件如下
[user1]
user_ip = 127.0.0.1
user_name = testuser1
user_id = 45
[user2]
user_ip = 127.0.0.2
user_name = testuser2
user_id = 41
写一个write_config.py
来更改配置文件
import configparser
import numpy as np
import copy
conf = configparser.ConfigParser()
filename = "config.ini"
conf.read(filename)
node = "user1" #改user1
key = "user_id"
value = "00"
conf.set(node, key, value)
fh = open(filename, 'w')
conf.write(fh) # 把要修改的节点的内容写到文件中
fh.close()
运行此文件之后,发现配置文件变了
[user1]
user_ip = 127.0.0.1
user_name = testuser1
user_id = 00 #改为00
[user2]
user_ip = 127.0.0.2
user_name = testuser2
user_id = 41
使用for循环将两个user同时改
import configparser
import numpy as np
import copy
conf = configparser.ConfigParser()
filename = "config.ini"
conf.read(filename)
secs = conf.sections()
user_ip = ['192.168.0','192.168.1']
user_name = ['python','python1']
user_id = ['111','222']
ip_key = 'user_ip'
name_key = 'user_name'
id_key = 'user_id'
for i in range(len(secs)):
conf.set(secs[i], ip_key,user_ip[i])
conf.set(secs[i], name_key, user_name[i])
conf.set(secs[i], id_key, user_id[i])
fh = open(filename, 'w')
conf.write(fh)
fh.close()
当然,conf.set可以直接指定字段,不用重命名
import configparser
import numpy as np
conf = configparser.ConfigParser()
filename = "config.ini"
conf.read(filename)
secs = conf.sections()
user_ip = ['192.168.0','192.168.1']
user_name = ['python','python1']
user_id = ['111','222']
for i in range(len(secs)):
conf.set(secs[i], 'user_ip', user_ip[i])
conf.set(secs[i], 'user_name', user_name[i]) #直接指定字段
conf.set(secs[i], 'user_id', user_id[i])
fh = open(filename, 'w')
conf.write(fh)
fh.close()
结果为
[user1]
user_ip = 192.168.0
user_name = python
user_id = 111
[user2]
user_ip = 192.168.1
user_name = python1
user_id = 222
以上都是没有写成类的,要写成类的形式可以看参考文献【1】
config.remove_option('user1', 'user_ip')# 删除user1分组的user_ip
config.remove_section('user1')# 删除配置文件中user1分组(会将整个user1下的ip,id,name都删除)
更多关于config的使用可以看官网
现在有另一个需求:将修改后的配置文件保存到一个名为config.txt
的文件中,并去掉中括号内的字符,即去掉[user1],[user2]
上面的代码,实际上修改完之后通过open可以写入到新文件中(原文件的内容不会改变)
for i in range(len(secs)):
conf.set(secs[i], 'user_ip', user_ip[i])
conf.set(secs[i], 'user_name', user_name[i]) #直接指定字段
conf.set(secs[i], 'user_id', user_id[i])
#fh = open(filename, 'w')
fh = open('config.txt','w') #文件另存到config.txt中
conf.write(fh)
fh.close()
现在需要将[user1],[user2]
字段去掉,一个方法是将它们替换为空。比如这里将[user2]
改为空,即``,注意不是表示的空格,而是none。
import configparser
import numpy as np
conf = configparser.ConfigParser()
filename = "config.ini"
conf.read(filename)
secs = conf.sections()
user_ip = ['192.168.0','192.168.1']
user_name = ['python','python1']
user_id = ['111','222']
for i in range(len(secs)):
conf.set(secs[i], 'user_ip', user_ip[i])
conf.set(secs[i], 'user_name', user_name[i]) #直接指定字段
conf.set(secs[i], 'user_id', user_id[i])
#fh = open(filename, 'w')
fh = open('config.txt','w') #文件另存到config.txt中
conf.write(fh)
fh.close()
#将[user2]去掉
with open('config.txt', 'r') as fpr:
content = fpr.read()
content = content.replace('[user2]', '')
with open('config.txt', 'w') as fpw: #如果要另存为a.txt,则将config.txt改为a.txt
fpw.write(content)
import re
# read file
f1 = open('config.txt','r')
f2 = open('a.txt','w')
# write file
for ss in f1.readlines():
a = re.sub(r'\[user2\]','',ss)
f2.write(a)
f1.close()
f2.close()
上面需要注意,正则表达式如果没有斜杠,\[user\]
,会表示将所有的user都换掉,包括user_id
等里面的user字符都去掉。那么既然使用了正则表达式,就可以将user1,user2同时去掉了,可以规定但凡有[user*
的都去掉(*
表示后面所有)或者但凡user
后有数字接着的都去掉。这部分可以看参考文献【3】
所以只需要将上面的代码改为:
# read file
f1 = open('config.txt','r')
f2 = open('a.txt','w')
# write file
for ss in f1.readlines():
a = re.sub(r'\[user\d\]','',ss) #\d表示匹配0-9数字
f2.write(a)
f1.close()
f2.close()
import configparser
import numpy as np
import re
conf = configparser.ConfigParser()
filename = "config.ini"
conf.read(filename)
secs = conf.sections()
user_ip = ['192.168.0','192.168.1']
user_name = ['python','python1']
user_id = ['111','222']
for i in range(len(secs)):
conf.set(secs[i], 'user_ip', user_ip[i])
conf.set(secs[i], 'user_name', user_name[i]) #直接指定字段
conf.set(secs[i], 'user_id', user_id[i])
#fh = open(filename, 'w')
fh = open('config.txt','w') #文件另存到config.txt中
conf.write(fh)
fh.close()
# read file
f1 = open('config.txt','r')
f2 = open('a.txt','w')
# write file
for ss in f1.readlines():
a = re.sub(r'\[user\d\]','',ss)
f2.write(a)
f1.close()
f2.close()