常用文件类型 — INI文件介绍

  • Post author:
  • Post category:其他




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)