Python 通过txt配置生成FlatBuff源码

# -*- 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("傲是是"))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值