Python Basic - configparser(配置文件模塊)增刪查改

前言

基本上,所有的應用程序都有配置文件,如ELK,MySQL,vsftpd,zabbix等這些應用程序都具有配置文件,配置文件主要將一些需要改變軟件使用的一些參數定義在配置文件中,讓程序只管運行,而運行的時候需要使用的參數根據不同的需求自行選擇。在Python中使用此模塊用於編寫相應的配置文件。

示例一個MySQL的配置文件

[root@whzabbix ~]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#default-character-set=utf8
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password

#datadir=/var/lib/mysql
user=mysql
datadir=/data/Mysql/Data
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld-error.log
pid-file=/var/run/mysqld/mysqld.pid
slow-query-log=1
slow-query-log-file=/var/log/mysql-slow.log
long_query_time=0.2
log-bin=/data/Mysql/Logs/bin.log
relay-log=/data/Mysql/Logs/relay.log
binlog_format=ROW
relay_log_recovery=1
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect ='SET NAMES utf8mb4'
innodb_buffer_pool_size=5G
join_buffer_size=128M
sort_buffer_size=2M
read_rnd_buffer_size=2M
log_timestamps = SYSTEM
lower_case_table_names = 1
innodb_file_per_table=1
innodb_log_file_size=20M
max_allowed_packet=32M
max_connections=4096
binlog_expire_logs_seconds=604800
default_authentication_plugin= mysql_native_password
[client]
port=3306
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock

[mysql]
default-character-set=utf8mb4

配置文件分析

此配置文件有3個章節(section)[mysqld],[client],[mysql]。而每個章節內還有多個鍵值對兒(key = value)這種,所以整個是一個字典的嵌套。最外一層字典3個key,分別爲[mysqld],[client],[mysql],然後每個章節下面的各種配置項爲該key的值,而下面的每一個配置項也是一個字典,一個key = value,所以這裏是兩層字典嵌套。

使用Python 生成此配置文件

import configparser

mysqlconfig = configparser.ConfigParser()

mysqlconfig["mysqld"] = {
"user" : "mysql",
"datadir" : "/data/Mysql/Data",
"socket" : "/var/lib/mysql/mysql.sock"
}

mysqlconfig["client"] = {
    "port" : 3306,
    "default-character-set" : "utf8mb4",
    "socket" :  "/var/lib/mysql/mysql.sock"
}

mysqlconfig["mysql"] = {}
mysqlconfig["mysql"]["default-character-set"] = "utf8mb4"


with open("my.cnf","w") as configfile:
    mysqlconfig.write(configfile)

因爲沒有寫絕對路徑,所以會在程序執行的當前目錄生成一個文件,“my.cnf”,文件內容如下:

[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock

[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4

"查"配置文件

使用python讀配置文件

import configparser

mysqlconfig = configparser.ConfigParser()
print(mysqlconfig.sections())

mysqlconfig.read("my.cnf")
print(mysqlconfig.sections())
print(mysqlconfig.options("mysqld"))
print(mysqlconfig.items("mysqld"))

print(mysqlconfig.get("mysqld","user"))
print(mysqlconfig.getint("client","port"))

"""
[]
['mysqld', 'client', 'mysql']
['user', 'datadir', 'socket']
[('user', 'mysql'), ('datadir', '/data/Mysql/Data'), ('socket', '/var/lib/mysql/mysql.sock')]
mysql
3306
"""

使用python判斷配置文件中是否有某一章節

import configparser

mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")
print(mysqlconfig.has_section("mysql"))
"""
True
"""

使用python判斷配置文件中的某一章節中是否有某個參數

import configparser

mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")
print(mysqlconfig.has_option("mysqld","user"))
print(mysqlconfig.has_option("mysqld","password"))
"""
True
False
"""

默認的也會一同輸出。

“增”配置文件

增章節

原配置文件內容

[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock

[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4

增加章節(section)

import configparser

mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")
mysqlconfig.add_section("newsection")
mysqlconfig.write(open("my.cnf","w"))

增加後配置內容

[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock

[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4

[newsection]

“增”選項

增加前配置文件內容

[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock

[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4

[newsection]

增加配置文件內容

import configparser

mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")
mysqlconfig.set("newsection", "protocol" , "mysql")
mysqlconfig.write(open("my.cnf","w"))

增加後配置文件內容

[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock

[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4

[newsection]
protocol = mysql

“刪”配置文件

刪選項

刪選項之前配置文件內容

[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock

[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4

[newsection]
protocol = mysql

刪選項的腳本

import configparser

mysqlconfig = configparser.ConfigParser()
#修改或者刪除之前得讀出來後纔可以操作
mysqlconfig.read("my.cnf")
mysqlconfig.remove_option("newsection","protocol")
mysqlconfig.write(open("my.cnf","w"))

刪選項之後配置文件內容

[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock

[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4

[newsection]


相應的選項已經被移除了

刪章節

刪章節之前的配置

[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock

[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4

[newsection]

刪章節腳本

import configparser

mysqlconfig = configparser.ConfigParser()
#修改或者刪除之前得讀出來後纔可以操作
mysqlconfig.read("my.cnf")
mysqlconfig.remove_section("newsection")
mysqlconfig.write(open("my.cnf","w"))

刪章節之後的配置

[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock

[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4


“改”配置文件

改之前配置文件內容

[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock

[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4


改配置文件腳本

import configparser

mysqlconfig = configparser.ConfigParser()

mysqlconfig.read("my.cnf")

mysqlconfig.set("client","port","5000")
mysqlconfig.write(open("my.cnf","w"))

改之後配置文件內容

[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock

[client]
port = 5000
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4

寫其實是將現有文件的內容寫到其它文件後覆蓋
所以,並不是修改,而是覆蓋。

遍歷

使用python遍歷配置文件章節

import configparser

mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")

for key in mysqlconfig:
    print(key)

"""
DEFAULT
mysqld
client
mysql
"""

使用python遍歷配置文件中的配置項

import configparser

mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")

for key in mysqlconfig["mysqld"]:
    print(key)

"""
user
datadir
socket
"""
備註:如果有DEFAULT章節,如果只遍歷一個非DEFAULT章節,DEFAULT章節也會一同輸出。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章