初次使用Python脚本,proto协议文件转Lua代码
使用IntelliJ IDEA编辑器编写Lua脚本的时候,安装一个插件 "EmmyLua" 可以对有代码提示功能
想把protoBuf协议文件转成Lua代码,然后给出代码提示
第一次使用python脚本
使用到的几个功能记录一下
1.设置为文件格式备注为utf-8
#!/usr/bin/python
# -*- coding: UTF-8 -*-
2.定义一个方法,可以返回多个值
#--------------------------------------------
# 替换字符串方法
#--------------------------------------------
#define a function
def ReplaceStr(s):
#TODO ... (自己的逻辑)
return s
#备注:方法可以返回多个值
def MyFunc(s):
local s1 = "我是s1"
return s,s1
#调用时,用两个变量接
rtS,rtS1 = MyFunc(str)
2.替换字符串
s = s.replace('=', ' '); #先把所有的'='替换成'空格'
3.用正则替换任意个数的'空格'换成'-'
s = re.sub(r'\s+', '-', s); #把任意多个'空格'替换成'-'
4.把字符串分割成数组
arrSplit = s.split('-') #把"1-2-3" 分割成 [1,2,3]
5.逻辑判断 if-else 和 与或非
typeValue = ""
if s == "int32":
typeValue = "0"
elif s == "int64":
typeValue = "0"
else:
typeValue = "{}"
# 判断符号
# 等于'=='
6.把字符串分割成数组
arrSplit = s.split('-') #把"1-2-3" 分割成 [1,2,3]
7.读文件
fileRead = open("client2server.proto") # 返回一个文件对象
line = fileRead.readline() # 调用文件的 readline()方法
while line:
print line
# 读取下一行,while循环,直到读完最后一行
line = fileRead.readline()
8.写文件
fileWrite = open('LuaProto.lua', 'w')
fileWrite.write(allStr)
fileWrite.close( )
print "文件保存成功,当前目录下的LuaProto.lua"
以下是代码
Proto文件
// msgType = 1
// 客户端 -> 服务器
// 发送登录消息,包括账号和密码
message Login {
required string user = 1;
required string pwd = 2;
}
message LoginRt {
required int32 rt = 1;
required string token = 2;
}
python脚本
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import re
#--------------------------------------------
# 替换字符串方法
#--------------------------------------------
#define a function
def ReplaceStr(s):
s = s.replace('=', ' '); #先把所有的'='替换成'空格'
s = s.replace('=', ' '); #先把所有的'='替换成'空格'
s = s.replace('{', ' '); #先把所有的'{'替换成'空格'
s = s.replace('\t', ' '); #先把所有的'\t'替换成'空格'
s = re.sub(r'\s+', '-', s); #把任意多个'空格'替换成'-'
return s
#--------------------------------------------
# 检测类型赋值
#--------------------------------------------
#define a function
def GetTypeValue(s):
typeValue = ""
if s == "int32":
typeValue = "0"
elif s == "int64":
typeValue = "0"
elif s == "string":
typeValue = "\"\""
elif s == "string":
typeValue = "\"\""
else:
typeValue = "{}"
return typeValue
#--------------------------------------------
# 检测类型替换后的字符串
#--------------------------------------------
#define a function
def CheckType(s,clsStr):
rtStr = ""
arrSplit = s.split('-')
newCls = ""
if arrSplit[0] == "message":
newCls = arrSplit[1]
rtStr += "\n---@class " + newCls + '\n'
rtStr += newCls + " = {}"
rtStr += '\n'
elif (len(arrSplit) > 3) and (arrSplit[1] == "required" or arrSplit[1] == "repeated" or arrSplit[1] == "optional"):
rtStr += clsStr + "." + arrSplit[3] + " = " + GetTypeValue(arrSplit[2])
rtStr += '\n'
#elif arrSplit[0] == '}':
#rtStr += '}'
return rtStr, newCls
#--------------------------------------------
# 读取文件
#--------------------------------------------
allStr = "" #拼接的字符串,用来写文件
lastClass = "" #记录上一个ClassName
fileRead = open("client2server.proto") # 返回一个文件对象
line = fileRead.readline() # 调用文件的 readline()方法
while line:
rptStr = ""
rptStr = ReplaceStr(line) #自己写的替换字符串
rptStr,tmpCls = CheckType(rptStr,lastClass)
if tmpCls != "":
lastClass = tmpCls
allStr += rptStr
line = fileRead.readline()
#--------------------------------------------
# 写文件
#--------------------------------------------
fileWrite = open('LuaProto.lua', 'w')
fileWrite.write(allStr)
fileWrite.close( )
print "文件保存成功,当前目录下的LuaProto.lua"
生成后的Lua文件
---@class Login
Login = {}
Login.user= ""
Login.pwd = ""
---@class LoginRt
LoginRt = {}
LoginRt.rt = 0
LoginRt.token = ""
API 参考
菜鸟教程 Python 基础教程
http://www.runoob.com/python/python-tutorial.html
初次使用Python脚本,proto协议文件转Lua代码的更多相关文章
- python脚本解析json文件
python脚本解析json文件 没写完.但是有效果.初次尝试,写的比较不简洁... 比较烦的地方在于: 1,中文编码: pSpecs.decode('raw_unicode_escape') 2,花 ...
- 利用Python 脚本生成 .h5 文件 代码
利用Python 脚本生成 .h5 文件 import os, json, argparse from threading import Thread from Queue import Queue ...
- C#调用Python脚本打印pdf文件
介绍:通过pdf地址先将文件下载到本地,然后调用打印机打印,最后将下载的文件删除. 环境:windows系统.(windows64位) windows系统中安装python3.6.2环境 资料: O ...
- python脚本将json文件生成C语言结构体
1.引言 以前用过python脚本根据excel生成相关C语言代码,其实本质就是文件的读写,主要是逻辑问题,这次尝试将json文件生成C语言的结构体. 2.代码 这是一个json文件,生成这个结构体的 ...
- Python脚本破解压缩文件口令(zipfile)
环境:Windows python版本2.7.15 Python中操作zip压缩文件的模块是 zipfile . 相关文章:Python中zipfile压缩文件模块的使用 我们破解压缩文件的口令也是用 ...
- python调用另一个文件中的代码,pycharm环境下:同文件夹下文件(.py)之间的调用,出现红线问题
如何调用另一个python文件中的代码无论我们选择用何种语言进行程序设计时,都不可能只有一个文件(除了“hello world”),通常情况下,我们都需要在一个文件中调用另外一个文件的函数呀数据等等, ...
- python脚本修改hosts文件
用python3写了个修改hosts的小脚本,没有技术含量,顺带复习一下文件操作和os.sys模块的内容了. # -*- coding:utf-8 -*- #!/usr/bin/env python ...
- python脚本批量复制文件
1.拷贝一个目录下的所有文件及文件夹到另一个目录下(递归拷贝) # cat /home/test.py #!/usr/bin/python import os import shutil def ...
- Python脚本:删除文件夹下的重复图片,实现图片去重
近期在整理相册的时候,发现相册中有许多重复图片,人工一张张筛查删除太枯燥,便写下这个脚本,用于删除文件夹下重复的图片. 第一部分:判断两张图片是否相同 要查找重复的图片,必然绕不开判断两张图片是否相同 ...
随机推荐
- JavaScript中的内存泄漏以及如何处理
随着现在的编程语言功能越来越成熟.复杂,内存管理也容易被大家忽略.本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题. 概 ...
- 老男孩Python全栈开发(92天全)视频教程 自学笔记01
day1课程目录: 开课介绍(1) 开课介绍(2) 开课介绍(3) 电脑简史(1) 电脑简史(2) 计算机结构 day1课程内容梳理: 导师介绍: Alex Li(金角大王):买了一辆特斯拉,喜欢姑娘 ...
- UTF-8和UTF-8无BOM,一个会导致文件中中文变量无法匹配的bug
昨晚用dom4j中的selectSingleNode解析xml,匹配节点. 发现匹配不到,但是确实存在该节点 将regex改为regex1后则可以匹配,也就是说文件中的"阿里旺旺" ...
- 项目实战6—Mysql实现企业级日志管理、备份与恢复实战
Mysql实现企业级日志管理.备份与恢复实战 环境背景:随着业务的发展,公司业务和规模不断扩大,网站积累了大量的用户信息和数据,对于一家互联网公司来说,用户和业务数据是根基.一旦公司的数据错乱或者丢失 ...
- mysql 双机热备注意事项
上一篇文章已经介绍过 主从复制, 本文对主从复制只是简单描述,如对主从复制不清楚的,可以先看上一篇文章 主从复制 一:介绍 mysql版本:5.7.20 第一个主服服务器ip:192. ...
- 16. 使用Exhibitor管理ZooKeeper
Exhibitor是管理ZooKeeper服务实例的主管服务.由Netflix开发和开放源码,对于ZooKeeper的实例监控.备份/恢复.清理和可视化非常有用. Note Netflix Exhib ...
- angular中复制文字到剪切板
function copyToClipboard(oElement, value) { var aux = document.createElement("input"); if ...
- php代码在服务器中查看接值
error_log("You messed up!", 3, "/var/tmp/my-errors.log");
- 两个实用linux小工具
使用 sshpass 工具来做名密码输入 使用 alias 别名来做成命令语句. Linux命令之非交互SSH密码验证-sshpass ssh登陆不能在命令行中指定密码.sshpass的出现,解决了这 ...
- 小白的Python之路 day1 Python3的bytes/str之别
原文:The bytes/str dichotomy in Python 3 Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二 ...