ini配置文件
ini文件是initialization file的缩写,即初始化文件,是widows系统配置文件所采用的存储格式。
文件扩展名: .ini
ini配置文件的后缀名也不一定必须是.ini, 也可以是.cfg, .conf或者是.txt
ini文件格式
ini配置文件由参数, 节, 注解组成
参数(parameter)
以键值对的形式存在
name=value
每个参数都有一个name和一个value,name和value由等号=分隔
节(section)
所有的键值对都是以节section为单位结合在一起的
所有的section名称都是独占一行,并且section名字都被方括号包围着[ ]
在section声明后的所有parameters都属于这个section
一个section没有明显的结束标识符,一个section的开始就是上一个section的结束
section不能重复,数据通过section去查找,每个seletion下可以有多个key和value的键值对
[section]
注解
comments使用分号表示, 在分号后面的文字,直到该行结尾全部为注解。
;comment ini文件的数据格式例子
例子
[Section1] ;section namekeyname1=value1keyname2=value2[Section2] ;section namekeyname3=value3keyname4=value4
section用来表示一个段落,ini文件可能是项目中共用的,使用section段名来区分不同用途的参数区
;串口配置实例[port]portname=COM4port=4
其他说明
- 在windows系统中,INI文件很多,最重要的是System.ini , System32.ini 和 Win.ini
- ini文件主要存放用户所作的选择以及系统的各种参数,用户可用通过修改ini文件,来改变应用程序和系统的很多配置
- 从windows95开始,在windows系统中推出了注册表的概念,ini文件在windows系统的地位开始下降。注册表可以使程序和系统都把许多参数和初始化信息存放进注册表中。
- 通常将服务器相关的配置信息写入到ini配置文件,然后ini配置文件的路径通过系统环境变量XXX_CONFIG_PATH来进行动态指定
ini配置文件(python)
python3中自带configparser模块来读取ini文件
import configparser#文件路径cfgpath = "cfg.ini"# 创建管理对象conf = configparser.ConfigParser()# 读ini文件conf.read(cfgpath,encoding="utf-8") #python3需要加个参数:encoding="utf-8"# 获取所有的sectionsections = conf.sections()print(sections)# 返回listitems = conf.items('serialport')# 参数是 section的名称print(items)# list里面对象是元祖
remove
# 删除一个section中的一个item(以键值KEY为标识)conf.remove_option('serialport', "port")# 参数section名 key名# 删除整个section这一项conf.remove_section('serialport')
add
# 添加一个sectionconf.add_section("serialport")
# 往section添加key和valueconf.set("serialport", "port", "com4")
write
write写入有两种方式
删除原文件内容,重新写入
conf.write(open(cfgpath, "w"))# 删除原文件重新写入
在原文件基础上继续写入内容,追加模式
conf.write(open(cfgpath, "a"))# 追加模式写入
remove和set方法并没有真正的修改ini文件内容,只有当执行conf.write()方法的时候,才会修改ini文件内容
写入中文的话,需要加上写入的编码格式:encoding=“utf-8”
# 修改section里面的值conf.set("week", "day", "星期一")# 写入中文conf.write(open(cfgpath, "a", encoding="utf-8"))# a模式 编码格式
python例子
config.ini文件
[strings] #Mode: train, test, serve配置执行器的工作模式 mode = train #配置模型文件的存储路径 working_directory = model #配置训练文件的路径 dataset_path=train_data/ [ints] #配置分类图像的种类数量 num_dataset_classes=10 #配置训练数据的总大小 dataset_size=50000 #配置图像输入的尺寸 im_dim=32 num_channels = 3 #配置训练文件的数量 num_files=5 #配置每个训练文件中的图像数量 images_per_file=10000 #配置批训练数据的大小 batch_size=32 [floats] #配置Dropout神经元失效的概率 rate=0.5
解析
import configparser #定义读取配置文件函数,分别读取section的配置参数,section包括ints、floats、strings def get_config(config_file='./config.ini'): parser=configparser.ConfigParser() parser.read(config_file,encoding="utf-8") #获取整型参数,按照key-value的形式保存 _conf_ints = [(key, int(value)) for key, value in parser.items ('ints')] #获取浮点型参数,按照key-value的形式保存 _conf_floats = [(key, float(value)) for key, value in parser.items ('floats')] #获取字符型参数,按照key-value的形式保存 _conf_strings = [(key, str(value)) for key, value in parser.items ('strings')] #返回一个字典对象,包含读取的参数 print(_conf_ints)return dict(_conf_ints + _conf_floats + _conf_strings)
返回的就是 字典类型
ini配置文件(c语言)
详细可以参考: https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getprivateprofileint
write
WritePrivateProfileString
BOOL WritePrivateProfileString([in] LPCSTR lpAppName,[in] LPCSTR lpKeyName,[in] LPCSTR lpString,[in] LPCSTR lpFileName);
lpAppName
节section名
lpKeyName
键值对的键名,如果为NULL,删除整个节
lpString
键值对的值,如果为NULL,对应的键将被删除
lpFileName
ini文件路径及名称
返回值:成功非0,失败0
read
GetPrivateProfileInt
UINT GetPrivateProfileInt([in] LPCTSTR lpAppName,[in] LPCTSTR lpKeyName,[in] INT nDefault,[in] LPCTSTR lpFileName);
- lpAppName 节名
- lpKeyName 键名
- nDefault 默认值,如果没找到则返回
- lpFileName ini文件名
- 返回键对应的值,失败返回默认值
GetPrivateProfileString
DWORD GetPrivateProfileString([in]LPCTSTR lpAppName,[in]LPCTSTR lpKeyName,[in]LPCTSTR lpDefault,[out] LPTSTRlpReturnedString,[in]DWORD nSize,[in]LPCTSTR lpFileName);
- lpReturnedString 接收返回数组的buf
- nSize buf的大小
- 返回复制到lpReturnedString中的字节数
c例子
读配置文件
[strings] mode = train [ints] dataset_size=50000 [floats]rate=0.5
#include #include int main(){char mode [50];int mode_len =GetPrivateProfileString("strings","mode",NULL,mode,50,"./config.ini");int dataset_size = GetPrivateProfileInt("ints","dataset_size",0,"./config.ini");printf("mode: %s\r\n",mode);printf("dataset_size: %d\r\n",dataset_size);return 0;}
读浮点数
没有内置读浮点数的函数,需要自己实现一个。
float GetPrivateProfileFloat(LPCSTR lpAppName,LPCSTR lpKeyName,INT nDefault,LPCSTR lpFileName){float f = nDefault;char strValue[50] = {0};GetPrivateProfileString(lpAppName,lpKeyName,"",strValue,50,lpFileName);if(strlen(strValue) != 0){f= (float)atof(strValue);}return f;}
参考
微软手册: https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getprivateprofileint