# -*- 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("傲是是"))