文章目录
INI文件介绍
1.1 ini语法格式
- 一个ini文件是由多个section(段)组成。
- 每个段中都包含多个option(数据项),以key=vlaue形式存储数据;
- 注释 以 # 或者 ; 开头。
1.2 ini文件示例
# config.ini
[user_info]
name = zhangsan
age = 18
gender = 男
is_admin = true
[connect]
host = 127.0.0.1
user = db
password = 123456
port = 1521
db = zet
1.3 使用python操作ini文件
1.3.1 环境准备
python使用内置包 configparser对ini文件进行操作,不需要安装依赖包。
1.3.2 读取ini文件
-
示例代码读取[
1.2
]中的示例文件
import configparser
config = configparser.ConfigParser()
file_path = 'config.ini' # 相对路径
config.read(file_path, encoding='utf8')
# 获取
# 获取所有的段
sections = config.sections()
print('所有段:', sections) # 所有段: ['user_info', 'connect']
# 第一种读取方法
value = config['user_info']['name']
print('第一种方法的读取的值:', value) # 第一种方法的读取的值: zhangsan
# 第二种方式
value = config.get('connect', 'db')
print('第二种方法的读取的值:', value) # 第二种方法的读取的值: zet
# 通过get获取到只能是str,如果获取其他类型,请使用getint getboolean getfloat
# 获取整数
value = config.getint('connect', 'port')
print('端口信息:%d' % value) # 端口信息:1521
# 获取bool值
value = config.getboolean('user_info', 'is_admin')
print('是否管理员:', value) # 是否管理员: True
# 第三种读取ini文件方式,读取到一个section中的所有数据,返回一个列表
value = config.items('user_info')
print('第三种方法读取到的值:', value)
# 第三种方法读取到的值: [('name', 'zhangsan'), ('age', '18'), ('gender', '男'), ('is_admin', 'true')]
1.3.3 修改ini文件
# 判断是否包含user1的段,如果没有添加新段,并写入config.ini。
if not config.has_section('user1'):
config.add_section('user1')
config.set('user1', 'name', 'lisi')
config.set('user1', 'age', '18') # set只能设备str
config.write(open(file_path, 'w', encoding='utf8'))
1.3.4 封装工具类
import configparser
class INIHelper(object):
@staticmethod
def read_from_ini(path, section=None, option=None, encoding='utf8'):
"""
读取ini文件,变成python格式并返回。
:param path: 文件路径
:param section: 段名,可不传,不传返回所有段 ,传入时返回指定段
:param option: 选项名,可不传,传入时,需要和段名配合使用。
:param encoding: 编码,默认为utf8
:return: 当同时传入段名以及选项名时,返回字符串,其他情况返回字典。
"""
config = configparser.ConfigParser()
config.read(path, encoding=encoding)
res = dict()
if not section:
sections = config.sections()
for temp_section in sections:
section_values = config.items(temp_section)
res[temp_section] = section_values
return res
else:
if not config.has_section(section):
return None
if not option:
res[section] = config.items(section)
return res
else:
if not config.has_option(section, option):
return None
return config.get(section, option)
@classmethod
def write_to_ini(cls, path, data: dict, mode='a', encoding='utf8'):
"""
将配置写入ini
:param path: 文件路径
:param data: 多层dict,形如下方:
{"user1": [('name','wangwu'),('age','18')]}
或者
{"user2":{"name":"zhaoliu","age":"19"}}
:param mode:写入模式,a为追加,w 为覆盖
:param encoding: 编码,默认utf8
:return: 返回值
"""
try:
config = configparser.ConfigParser()
for section in data:
if not config.has_section(section):
config.add_section(section)
if isinstance(data[section], tuple) or isinstance(data[section], list):
for key, value in data[section]:
config.set(section, key, str(value))
if isinstance(data[section], dict):
for key, value in data[section].items():
config.set(section, key, str(value))
config.write(open(path, mode, encoding=encoding))
return True
except:
return False
1.3.5 调用示例
file_path = 'config.ini' # 相对路径
print(INIHelper.read_from_ini(file_path))
# {'user_info': [('name', 'zhangsan'), ('age', '18'), ('gender', '男'), ('is_admin', 'true')],
# 'connect': [('host', '127.0.0.1'), ('user', 'db'), ('password', '123456'), ('port', '1521'), ('db', 'zet')]}
print(INIHelper.read_from_ini(file_path, 'user_info'))
# {'user_info': [('name', 'zhangsan'), ('age', '18'), ('gender', '男'), ('is_admin', 'true')]}
print(INIHelper.read_from_ini(file_path, 'connect', 'host'))
# 127.0.0.1
print(INIHelper.read_from_ini(file_path, 'connect', 'host1')) # 获取不存在的数据项
# None
save_path = 'config1.ini'
# data = INIHelper.read_from_ini(file_path)
# data['user1'] = [('name', 'www'), ('age', '18')]
data = dict()
data['user1'] = {'name': 'zhangsan', 'age': 18}
res = INIHelper.write_to_ini(save_path, data)
print(res)