python之自动化生成解析ini文件的Qt类

原创 2015年11月18日 23:17:57

## genQtSetting.py


import os,sys,re
import shutil,string
from string import Template

gHearFile = "hcs_setting"
gSrcFile = "hcs_setting"
gClassName = "HCS_Setting"

#[OK]
class CObject(object):
    def __init__(self):
        self._group = ""
        self._gList = []
        self._gMap = {}
        self._gSaveList = ""
    def setGroup(self,group):
        self._group = group
    def addMember(self,key,value):
        self._gList.append(key)
        self._gMap[key] = value
    ###########################################################################
    #   Header File.
    #   QString getGroupFiled();
    ###########################################################################
    def toFunc_Def_List(self):
        res = ""
        for item in self._gList:
            tmp = "\t%s get%s%s();\n" % ("QString",self._group.capitalize() ,item.capitalize())
            res = res + tmp
        return res
    ###########################################################################
    #   Header File.
    ###########################################################################
    def toFunc_Imp_List(self):
        return ""
    ###########################################################################
    #   Header File.
    #   QString m_a;
    #   QString m_b;
    ###########################################################################
    def toVal_Def_List(self):
        res = ""
        for item in self._gList:
            tmp = "%s m_%s%s;\n\t" % ("QString",self._group[0].lower() + self._group[1:] ,item.capitalize())
            res = res + tmp
        return res
    ###########################################################################
    #   void loadSetting(const QString & fname){
    #       m_a = "";
    #   }
    ###########################################################################
    def toFunc_Init_List(self):
        res = ""
        for item in self._gList:
            tmp = "\tm_%s%s = \"\";\n" % (self._group[0].lower() + self._group[1:] ,item.capitalize())
            res = res + tmp
        res = res + "\n";
        return res
    ###########################################################################
    #   void loadSetting(const QString & fname){
    #       m_a = "";
    #       m_a = _data.value("a/b").value;
    #   }
    ###########################################################################
    def toFunc_Set_List(self):
        res = ""
        for item in self._gList:
            tmp = "\tm_%s%s = _data.value(\"%s/%s\").toString();\n" % (self._group[0].lower() + self._group[1:] ,item.capitalize(),self._group,item)
            res = res + tmp
        return res
    ###########################################################################
    #   void setGrouoOption(const QString & fname){
    #       m_a = fname;
    #   }
    ###########################################################################
    def toFunc_OutSet_List(self):
        res = ""
        for item in self._gList:
            s1 = "void %s::set%s%s(const QString & _value){\n" % (gClassName ,self._group.capitalize(),item.capitalize())
            s2 = "\tm_%s%s = %s;\n" % (self._group[0].lower() + self._group[1:] ,item.capitalize(),"_value");
            s3 = "}\n\n";
            s = s1 + s2 + s3
            res = res + s
        return res
    ###########################################################################
    #   void setGrouoOption(const QString & fname){
    #       m_a = fname;
    #   }
    ###########################################################################
    def toFunc_DefSet_List(self):
        res = ""
        for item in self._gList:
            s = "\tvoid set%s%s(const QString & _value);\n" % (self._group.capitalize(),item.capitalize())
            res = res + s
        return res
    ###########################################################################
    #   QString getGroupField(){
    #       return m_member;
    #   }
    ###########################################################################
    def toFunc_Get_List(self):
        res = ""
        for item in self._gList:
            s1 = "%s %s::get%s%s(){\n" % ("QString",gClassName,self._group.capitalize(),item.capitalize())
            s2 = "\treturn m_%s%s;\n" % (self._group[0].lower() + self._group[1:] ,item.capitalize())
            s3 = "}\n\n"
            s = s1 + s2 + s3
            res = res + s
        return res
    ###########################################################################
    #   QString getGroupField(){
    #       return m_member;
    #   }
    ###########################################################################
    def toFunc_Save_List(self):
    	list = ""
        for item in self._gList:
            s1 = "\t_data.setValue(\"%s/%s\" ,m_%s%s);\n" % (self._group ,item , self._group[0].lower() + self._group[1:] ,item.capitalize())
            list = list + s1
        return list

###########################################################################
#   write string to file.
###########################################################################
def writeToFile(str,fname):
    fp = open(fname,"w+")
    fp.write(str)
    fp.close()

###########################################################################
#   write the result to test.h | test.cpp file.
###########################################################################
def saveHeadFile(defList,varList ,defSetList):
    m_hContent = Template("""
/******************************************************************************
File name : ${FILE_NAME}.h
Tile	  : Header of the ${CLASS_NAME} class
******************************************************************************/
 #ifndef ${FILE_NAME}_H
 #define ${FILE_NAME}_H

 #include <QString>
 #include <QSettings>
 #include <QColor>

class ${CLASS_NAME}
{
public:
    ${CLASS_NAME}(){}
    static ${CLASS_NAME} * getInstance();
    void loadFile(const QString & fname);
    void saveFile();
    /*
		Getter/Setter
	*/
${FUNCTION_DEF_LIST}
${FUNCTION_DEFSET_LIST}
private:
    ${VAR_LIST}
    QSettings _data;
    QString m_iniFileName;
};
#endif""")
    h_str = m_hContent.substitute(FILE_NAME=gHearFile,
                                  CLASS_NAME=gClassName,
                                  FUNCTION_DEF_LIST=defList,
                                  FUNCTION_DEFSET_LIST=defSetList,
                                  VAR_LIST=varList)
    writeToFile(h_str,gHearFile + ".h")

def saveBodyFile(impList,getList,setList,instance,saveList):
    m_bContent = Template("""
/******************************************************************************
*
*  File name : ${FILE_NAME}.cpp
*  Title     : Implementation of the ${CLASS_NAME} class
*
******************************************************************************/
#include "${FILE_NAME}.h"

static ${CLASS_NAME} * gSetting = NULL;
${FUNCTION_INSTANCE}
${FUNCTION_IMPL_LIST}
${FUNCTION_GET_LIST}
${FUNCTION_SET_LIST}
${FUNCTION_SAVE_LIST}
""")
    b_str = m_bContent.substitute(FILE_NAME=gSrcFile,
                                  CLASS_NAME=gClassName,
                                  FUNCTION_INSTANCE=instance,
                                  FUNCTION_IMPL_LIST=impList,
                                  FUNCTION_GET_LIST=getList,
                                  FUNCTION_SET_LIST=setList,
                                  FUNCTION_SAVE_LIST=saveList)
    writeToFile(b_str,gSrcFile + ".cpp")
gObjList = []
gObj = CObject()

###################################################################################################
#[OK]   key=value
###################################################################################################
def processWord(s):
    global gObj
    s = s.strip()
    key,value = s.split("=",1)
    key = key.strip(" \r\n")
    value = value.strip(" \r\n")
    gObj.addMember(key,value)

###################################################################################################
#[OK]   getGroup("[Cache]") => "Cache"
###################################################################################################
def getGroup(str):
    str = str.strip()
    ret = re.match(r"\[(.+)\]$",str)
    if ret != None:
        return ret.group(1)
    return None

###################################################################################################
#[OK]   isGroup("[Cache]") => true
###################################################################################################
def isGroup(str):
    str = str.strip()
    ret = re.match(r"\[\w|\d]+\]$",str)
    if ret != None:
        return True
    return False

###################################################################################################
#[OK]   whether string is empty.
###################################################################################################
def isEmpty(str):
    if len(str) <= 1:
        return True
    else:
        return False

###################################################################################################
#[OK]   parse the content of ini file,
#       and generate the Node to gObjList.
###################################################################################################
def doParse(iniContent):
    global gObj,gObjList
    #getCin(hd)
    varList = ""
    fun_def_list = ""
    lineList = []
    m_group = ""
    
    lineList = iniContent.split("\n")
    isStart = True
    for s in lineList:
        s = s.strip()                       #   standared the string.
        if isEmpty(s):                      #   ignore the space line.
            continue
        if re.match("#",s) != None:         #   ignore the conment line.
            continue
        if isGroup(s):                      #   is [Cache] field.
            m_group = getGroup(s)
            if isStart == True:
                gObj.setGroup(m_group)
                isStart = False
            else:
                gObjList.append(gObj)
                gObj = CObject()
                gObj.setGroup(m_group)
        else:
            processWord(s)
    gObjList.append(gObj)

###################################################################################################
#[OK]   read content from fname.
###################################################################################################
def readFile(fname):
    with open(fname, 'r') as f:
        return f.read()

###################################################################################################
#[OK]   baseFilename("test.ini") => test
###################################################################################################
def baseFilename(fname):
    name,ext = fname.rsplit(".")
    return name

###################################################################################################
#[OK]   genSetting.py test.ini ,  True
#       check the user`s input args.
###################################################################################################
def checkArgs():
    arg_len = len(sys.argv)
    if arg_len != 2:
        print "[Usage: genSetting.py test.ini]"
        return False
    return True

###################################################################################################
#[OK]   checkFileFormat("test.ini") True
###################################################################################################
def checkFileFormat(fname):
    ret = re.search(r'\w+\.ini$',fname)
    if ret != None:
        return True
    return False

###################################################################################################
#[OK]   Main Function.
###################################################################################################
def main():
    global gObjList
    if checkArgs() == False:
        return
    if checkFileFormat(sys.argv[1]) == False:
        return
    base_name = baseFilename(sys.argv[1])
    iniContent = readFile(sys.argv[1])
    doParse(iniContent)
    m_varList = ""
    m_defList = ""
    m_impFunc = ""
    m_getList = ""
    m_initList = ""
    m_instance = ""
    m_setList = ""
    m_saveList = ""
    m_defSetList = ""
    for obj in gObjList:
        m_varList = m_varList + obj.toVal_Def_List()
        m_defList = m_defList + obj.toFunc_Def_List()
        m_getList = m_getList + obj.toFunc_Get_List()
        m_setList = m_setList + obj.toFunc_OutSet_List()
        m_impFunc = m_impFunc + obj.toFunc_Set_List()
        m_initList = m_initList + obj.toFunc_Init_List()
        m_saveList = m_saveList + obj.toFunc_Save_List()
        m_defSetList = m_defSetList + obj.toFunc_DefSet_List()
    m_instanceContent = Template("""
${CLASS_NAME} * ${CLASS_NAME}::getInstance(){
	if ( NULL == gSetting )
		gSetting = new ${CLASS_NAME}();
	return gSetting;
}
""")
    sv1 = "void %s::saveFile(){\n" % (gClassName)
    sv2 = "\tQSettings _data(m_iniFileName, QSettings::IniFormat);\n\t_data.setIniCodec(\"UTF-8\");\n";
    sv3 = m_saveList;
    m_saveList = sv1 + sv2 + sv3 + "}\n\n"
    m_instance = m_instanceContent.substitute(CLASS_NAME=gClassName)
    s1 = "void %s::loadFile(const QString & fname){\n" % (gClassName)
    s2 = "\tQSettings _data(fname, QSettings::IniFormat);\n\t_data.setIniCodec(\"UTF-8\");\n";
    s3 = "\t%s = %s;\n" % ("m_iniFileName" , "fname")
    s4 = "}\n"
    loadFunc = s1 + s2 + s3 + m_initList + m_impFunc + s4
    
    saveHeadFile(m_defList,m_varList ,m_defSetList)
    saveBodyFile(loadFunc,m_getList,m_setList,m_instance,m_saveList)

main()


@@用法说明

genQtSetting.py config.ini

生成解析config.ini文件的类

python解析ini、conf、cfg文件

1.使用python自带的ConfigParser模块: #test.cfg文件内容: [sec_a] a_key1 = 20 a_key2 = 10   [sec_b] b_key...
  • qq_21398167
  • qq_21398167
  • 2015年08月26日 16:10
  • 3712

QT ini配置文件的读写(使用QTextStream类)

1、写ini配置文件 bool saveFile(const QString &fileFullName) { if(fileFullName.isEmpty()) return false; QF...
  • lusirking
  • lusirking
  • 2016年05月09日 15:18
  • 1529

一个简单实用的ini解析算法

主程序先调用load()方法,继而调用其他public方法。
  • jiaozhurun
  • jiaozhurun
  • 2016年03月10日 09:19
  • 276

QT读写配置文件(.ini)

.ini 文件是Initialization File的缩写,即初始化文件。除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要求。一般不用直接编辑...
  • AnonymousRookie
  • AnonymousRookie
  • 2015年08月22日 08:41
  • 5965

python解析ini文件

python解析ini文件 使用configparser — Configuration file parser sections() add_section(section) h...
  • xkxjy
  • xkxjy
  • 2014年02月12日 22:15
  • 597

Qt解析INI配置文件

大部分的程序都会有相应的配置文件,如果一个程序没有任何配置文件,那么它对外界是完全封闭的,一旦程序需要修改一些参数必须要修改程序代码本身并重新编译。为了让程序出厂后还能根据需要进行必要的配置,即让程序...
  • luckydarcy
  • luckydarcy
  • 2017年01月24日 14:33
  • 955

Python解析INI文件

本文实例讲述了Python读写ini文件的方法。分享给大家供大家参考。具体如下: 比如有一个文件update.ini,里面有这些内容: ? 1 2 ...
  • u011304615
  • u011304615
  • 2017年04月12日 15:53
  • 231

QT 创建、读写INI文件

qt中创建,读写INI文件,写个小例子。 //write ini void MyTest::WriteIni() { //创建配置文件 QSettings *pIni = new Q...
  • wws0519
  • wws0519
  • 2015年12月11日 16:40
  • 927

inifile 一个轻量级的INI文件解析库

inifile 一个轻量级的INI文件解析库:ini文件是一种常见的配置文件。它以简单的文字与简单的结构组成.INI文件会以不同的扩展名,如".ini.",".cfg".INI文件由3个重要的部分组成...
  • qq910894904
  • qq910894904
  • 2014年08月15日 12:56
  • 15605

使用 python 读取 ini 文件

read_ini.ini:[baseconf] host=127.0.0.1 port=3306 user=root password=root db_name=evaluting_sys[concu...
  • HeatDeath
  • HeatDeath
  • 2017年06月01日 18:22
  • 1030
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python之自动化生成解析ini文件的Qt类
举报原因:
原因补充:

(最多只允许输入30个字)