- 最后登录
- 2021-7-6
- 注册时间
- 2012-12-27
- 阅读权限
- 90
- 积分
- 76145
 
- 纳金币
- 53488
- 精华
- 316
|
数据表热更新---uLua(一)
http://www.manew.com/thread-42298-1-1.html
(出处: -U3D游戏开发者社区【游戏蛮牛】)
前面已经讲了的我就不多赘述,我主要把CSV转Lua的py脚本贴出来
# -*- coding: utf-8 -*-
#cunkai
import os
import shutil
import re
import csv
import platform
import sys
import codecs
reload(sys)
sys.setdefaultencoding("utf-8")
sysType = platform.system()
ESC = chr(27)
# 字体
a_default = 0
a_bold = 1
a_italic = 3
a_underline= 4
# 前景颜色
fg_black = 30
fg_red = 31
fg_green = 32
fg_yellow = 33
fg_blue = 34
fg_magenta = 35
fg_cyan = 36
fg_white = 37
# 后景颜色
bg_black = 40
bg_red = 41
bg_green = 42
bg_yellow = 43
bg_blue = 44
bg_magenta = 45
bg_cyan = 46
bg_white = 47
def color_code(a):
return ESC+"[%dm"%a
def color_str(s, *args):
if(sysType =="Windows"):
return s
cs = ""
for a in args:
cs += color_code(a)
cs += s
cs += color_code(a_default)
return cs
print("\n\n\n\n\n\n\n\n\n")
path = os.path.split(os.path.realpath(__file__))[0]
csvPath = path+"/csv_folder/"
csharp = path+"/lua_folder/"
csvDataParentName = "csvDataParent"
dataManageName = "dataManage"
defaultcs = path+"/default/defaultclass.lua"
defaultcsv = path+"/default/defaultcsv.csv"
print(color_str("SYS: "+sysType,bg_blue, bg_cyan, a_bold))
print "coding: "+sys.getdefaultencoding()
classList = []
# 这个函数的作用就是把在 csv 表里读出来的数据 写成 "data1","data2","data3" 的形式
def toCsString(line):
isItem = 0
data = '\"'
for i in range(len(line)):
item = line
if item != '':
isItem = 1
data += item
if i<len(line)-1:
data += '|'
else:
data += '-1'
if i<len(line)-1:
data+='|'
data+='\"'
if isItem==0:
return ''
return data
def openFile(name,ftype):
fp=None
if(sysType =="Windows"):
try:
fp=open(name,ftype,encoding='utf-8')
except:
fp=open(name,ftype)
else:
fp=open(name,ftype)
return fp
def mkdir(path):
path=path.strip()
# 删除path字符串中结尾处,位于 "\\" 删除序列的字符
path=path.rstrip("\\")
isExists=os.path.exists(path)
if not isExists:
# print path+' OK'
# 作用: 创建递归的目录树,可以是相对或者绝对路径,mode的默认模式也是0777。
os.makedirs(path)
return True
else:
# print path+'OK'
return False
def toIfFromClass(name):
code = "\t\t\tif(className==\""+name+"\")\n\t\t\t{"+"\n\t\t\t\t"+"return "+name+".Instance();"+"\n\t\t\t}"
return code
# 从这个方法开始执行,rootDir = "/csv_folder/"
def start(rootDir):
# 遍历 rootDir 目录,返回 rootDir 目录下的所有文件
# list_dirs csv文件列表 接收了 os.walk 返回的 起始路径、起始路径下的文件夹、起始路径下的文件
list_dirs = os.walk(rootDir)
# remove old csharp csharp = path+"/csharp_folder/"
isExists=os.path.exists(csharp)
if isExists:
# shutil -- 是一种高层次的文件操作工具 remtree 删除整个目录
shutil.rmtree(csharp)
for root, dirs, files in list_dirs:
for f in files:
# 连接文件名和父路径 生成文件路径
filePath = os.path.join(root, f)
# 分割文件名文本,取到文件名和文件扩展名
fname, fextension = os.path.splitext(f)
# 通过连接得到(创建)csv 对应的 cs 文件
csharpFilePath = os.path.join(csharp, "data/"+fname)+".lua"
# csharpFilePath = csharpFilePath.replace(csvPath,csharp)
# 如果后缀名为 .csv
if fextension==".csv":
# print(f)
print(color_str(" -- "+f,fg_cyan, bg_black, a_bold))
# 创建文件夹
mkdir(csharp+"data")
# copy default.cs
# 复制一个文件到一个文件或一个目录 把模版内容复制到新建的 cs 文件中
shutil.copy(defaultcs,csharpFilePath)
#add classList
classList.append(fname)
#;compatible
fp = None
# 打开 csv 文件 权限 只读
fp=openFile(filePath,'r')
# 读取所有行
alllines=fp.readlines()
# 读取完毕关闭所有行
fp.close()
# defaultcsv = path+"/default/defaultcsv.csv"
fp=openFile(defaultcsv,'w')
#write start
for eachline in alllines:
#;compatible
# 第一个参数可用正则表达式, 把 eachline 里面的 逗号替换成分号
a=re.sub(';',',',eachline)
# 写到 defaultcsv.csv 中
fp.writelines(a)
fp.close()
if(sysType == "Windows"):
try:
reader = csv.reader(open(defaultcsv, 'rU',encoding='utf-8'), dialect='excel')
except:
reader = csv.reader(open(defaultcsv, 'rU'), dialect='excel')
else:
reader = csv.reader(open(defaultcsv, 'rU'), dialect='excel')
chinaKey = None
key = None
data = ''
for line in reader:
if chinaKey is None:
chinaKey = toCsString(line)
else:
if key is None:
key = toCsString(line)
else:
item = toCsString(line)
if item!='':
data = data +'{'+item+'}'+ ',\n\t\t'
#print(key)
#print(data)
# write *.cs
# read lines
fp = None
# 打开新建的 cs 脚本文件
fp=openFile(csharpFilePath,'r')
# 当然还是读一下 读出每一行
alllines=fp.readlines()
fp.close()
# 刚才给了读权限,现在给个写权限
fp=openFile(csharpFilePath,'w')
#write start
for eachline in alllines:
# class name
# 替换类名
a=re.sub('defaultclass',fname,eachline)
# china key
# 添加中文键
a=re.sub('defaultChinakey',chinaKey,a)
# allkey
# 添加英文 也就是代码中用到的键
a=re.sub('--defaultkey',key,a)
# alldata
# 添加所有的键值
a=re.sub('--defaultdata',data,a)
# csvDataParent
# 替换继承类的类名
#a=re.sub('defaultCsvDataParent',csvDataParentName,a)
fp.writelines(a)
fp.close()
# Step 1 程序入口
start(csvPath)
print(color_str("GOOD",fg_white, bg_green, a_italic))
#coding=utf-8
if(sysType =="Windows"):
raw_input(unicode('按回车键退出...','utf-8').encode('gbk'))
else:
raw_input(unicode('按回车键退出...','utf-8').encode('utf-8'))
|
|