python config配置文件的读写

文章目录

    • 1 基础知识
    • 2 读取配置文件
    • 3 改写配置文件
      • 3.1 删除section

参考文献:
【1】 python读取配置文件&&简单封装
【2】 python 中使用ConfigParser类修改配置文件
【3】 python3中的RE(正则表达式)-总结

1 基础知识

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

2 读取配置文件

下面代码有注释,关于使用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)

在这里插入图片描述

3 改写配置文件

已知原始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】

3.1 删除section

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)

结果如下
python config配置文件的读写_第1张图片
另外,可以使用正则表达式

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()

python config配置文件的读写_第2张图片

上面需要注意,正则表达式如果没有斜杠,\[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()

结果为
python config配置文件的读写_第3张图片
至此,完整代码如下:

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()

你可能感兴趣的:(python)