# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: Tools # Description: # Author: zhangchunhui # Date: 2019/1/27 # ------------------------------------------------------------------------------- import collections import os import sys import xml.etree.ElementTree as ET import numpy as np from flatbuffers import Builder ConfigPath = "./Config/Server" class DataParser: def __init__(self, fullFileName, fileName): """ 读取文件内容 :param fullFileName: :param fileName: """ # print(fullFileName) print(fileName) # f = open(fullFileName, "rb") # data = f.read() # print(chardet.detect(data)) # f.close() self.fileName = fileName.split('.')[0] file = open(fullFileName, 'r', encoding='GB18030') self.strCounts = file.read() self.list = self.strCounts.split('\n') file.close() def dealTitel(self): """ 处理标题 :return: """ self.titleDic = collections.OrderedDict() self.effectrow = [] if (len(self.list) > 4): titleList = self.list[0].split('\t') titleTypeList = self.list[1].split('\t') if titleList.__len__() != titleTypeList.__len__(): print("标题有问题 请检查:" + self.fileName) return for i in range(0, len(titleList)): titleStrName = titleList[i].strip() titleStrType = titleTypeList[i].strip() if (len(titleStrName) > 0 and len(titleStrType) > 0): self.titleDic[titleStrName] = titleStrType self.effectrow.append(i) else: print("配置文件出问题 请检查%s", self.fileName) def printTest(self): """ 输出查看 :return: """ for i in range(0, len(self.list)): str1 = self.list[i] print(str1) def writeFBS(self): """ 写出protoBuff3文件 :return: """ dom = ET.parse('ProtoTemplate.xml') importListStr = dom.getiterator("import") countStr = "namespace com.gameconfig\n;" self.protoFileName = self.fileName + ".fbs" countStr += "table " + self.fileName countStr += "\n{\n" i = 1 for titleStr1 in self.titleDic.keys(): countStr += " " + titleStr1 + ":" + getProtoType(self.titleDic[titleStr1]) + ";\n" i += 1 countStr += "}\n" countStr += "table " + self.fileName + "_root\n"; countStr += "\n{\n" countStr += " " + self.fileName + "s" + ":" + "[" + self.fileName + "];" countStr += "\n}\n" file = open("./flatbuff/" + self.protoFileName, 'w+', encoding='utf-8') file.write(countStr) file.close() def writeUTF8File(self): """ 写入文件信息 :return: """ file = open("./Out/" + self.fileName + ".txt", 'w+', encoding='utf-8') file.write(self.strCounts) file.close() def WritePythonCode(self): """ 生成proto文件 :return: """ command = "flatc --csharp -o ./flatbuff/ " + "./flatbuff/" + self.protoFileName os.system(command) command = "flatc --python -o ./flatbuff/ " + "./flatbuff/" + self.protoFileName os.system(command) def DealDataByte(self): builder = Builder(1) # try: # self._module_name = self.fileName # sys.path.append(os.getcwd() + "./flatbuff/com/gameconfig/") # exec('from ' + self._module_name + ' import *') # self._module = sys.modules[self._module_name] # # exec('from ' + self._module_name + "_root" + ' import *') # self._module_root = sys.modules[self._module_name + "_root"] # except Exception as e: # print("Load error" + e + self.fileName) # return # arrVint= [] # for i in range(3, len(self.list)): # # print(self.list[i]) # # 如果 id 是 空 直接跳过改行 # str1 = self.list[i].strip() # if (len(str1) > 0): # str1List = str1.split('\t') # if (len(str1List) > 0 and len(str1List[0]) > 0 and str1List[0].find("#") < 0): # arrVint.append((int)(self._ParseLine(builder, str1List))) # # funTmp = getattr(self._module_root, self.fileName + "_root" + "Start" + self.fileName + "sVector") # funTmp(builder, len(arrVint)) # # funTmp = getattr(self._module_root, self.fileName + "_root" + "Start") # # funTmp(builder) # funTmp = getattr(self._module_root, self.fileName + "_root" + "Add" + self.fileName + "s") # funTmp(builder, ) # funTmp = getattr(self._module_root, self.fileName + "_root" + "End") # builder.Finish(funTmp(builder)) # self.writeDataByte(builder.Bytes) def _ParseLine(self, buildr, lineList): """ 初始化一行数据 :param item: :return: """ i = 0 strMapTMp = {} for key in self.titleDic.keys(): # 如果 id 是 空 直接跳过改行 fild_value = getProtoValue(getProtoType(self.titleDic[key]), lineList[self.effectrow[i]]) if (getProtoType(self.titleDic[key]) == "string"): fileValueLen = buildr.CreateString(fild_value) strMapTMp[i] = fileValueLen break i += 1 funTmp = getattr(self._module, self.fileName + "Start") funTmp(buildr) i = 0 for key in self.titleDic.keys(): KeyTmp = key[0:1] KeyTmp2= key[1:] KeyTmp = KeyTmp.upper() funTmp = getattr(self._module, self.fileName + "Add" + KeyTmp + KeyTmp2) # 如果 id 是 空 直接跳过改行 fild_value = getProtoValue(getProtoType(self.titleDic[key]), lineList[self.effectrow[i]]) if (getProtoType(self.titleDic[key]) == "string"): funTmp(buildr, strMapTMp[i]) break else: funTmp(buildr, fild_value) i += 1 funTmp = getattr(self._module, self.fileName + "End") return funTmp(buildr) def writeDataByte(self, data): """ 生成byte文件 :param data: :return: """ file_name = self.fileName + ".bin" # self._proto_name.lower() + ".bin" file = open("./flatbuff/data/" + file_name, 'wb+') file.write(data) file.close() ProtoTypeDic = {"int": "int", "string": "string", "float": "float"} def getProtoType(typeStr): """ 获取类型转换 :param typeStr: :return: """ typeStr = typeStr.lower() return ProtoTypeDic.get(typeStr, "nothing") def getProtoValue(typeStr, valueStr): """ 获取值信息 :param typeStr: :param valueStr: :return: """ try: if typeStr == "int": if len(str(typeStr).strip()) <= 0: return 0 else: return int(valueStr) elif typeStr == "double" or typeStr == "float": if len(str(typeStr).strip()) <= 0: return float(0) else: return float(valueStr) elif typeStr == "string": return valueStr else: return None except BaseException as e: print("parse cell(%s, %s) error, please check it, maybe type is wrong." % (typeStr, valueStr)) raise def gci(filepath): """ 读取所有的txt 文件 :param filepath: :return: """ files = os.listdir(filepath) for fi in files: fi_d = os.path.join(filepath, fi) if os.path.isdir(fi_d): gci(fi_d) else: txtInfo = DataParser(fi_d, fi) # txtInfo.writeUTF8File() # txtInfo.printTest() txtInfo.dealTitel() txtInfo.writeFBS() txtInfo.WritePythonCode() txtInfo.DealDataByte() if __name__ == '__main__': gci(ConfigPath) # s = 'hEllopYthon' # print(s[0:1]) # builder = Builder(1) # print(builder.CreateString("傲是是"))
Python 通过txt配置生成FlatBuff源码
最新推荐文章于 2023-12-16 21:35:05 发布