#!/usr/bin/python
#-*- coding:utf-8 –*- import os
import sys
import re
import shutil
import xlrd
import xlwt
import getopt
import math
from xlutils.copy import copy '''
脚本使用:
设置strUiPorject ui项目名称,取值如下 "mstar"/"formal"/"haier"/"videocon"/"bbk"/"atv_project"
删除无用字串: ./genstr -d
特殊标记的字串优先排序: ./genstr -p
给已整理好优先级高的字串添加strMark..../genstr -a
读取 优先级字串整理.h 中的字串进行比对添加标记(未整理)./genstr -c 脚本功能:
1、根据strUiPorject设置的UI名称,迭代过滤UI目录的所有源文件和头文件,获取项目使用字串总数,并删除UIL多余字串
2、对某一种语言做特殊标记strMark,标记的字串会放在翻译的最前面
3、mstar优先级字串整理在mstarPrimaryString.h,已使用字串整理在UsedString.h中,
formal优先级字串整理在PrimaryString.h
执行过程:
1、设置UI项目名称
2、根据UI名称,配置过滤路径和UIL删除路径(filterPath/strUilPath)
3、再根据配置的路径执行过滤和删除动作 注意:
SourceCode中,有一些是 TV_IDS_String_ID+Offset方式获取新字串的,这些字串要手动加到脚本,以防误删
如:TV_IDS_String_GMT_0 字串
''' #=======注意此处设置UI项目================================#
#=="mstar"/"formal"/"haier"/"videocon"/"bbk"/"atv_project"=#
strUiPorject = "mstar"
#========================================================# g_deleteMode = 0
g_priorityMode = 0
g_AddmarkMode = 0
g_CompareMode = 0 setStr = set()
tupleStr = ()
strMark = "aaaa" #=======================以下不需要设置=======================#
if "bbk" in strUiPorject:
filterPath = "aps/application/radisson/formal"
strUilPath = "aps/application/radisson/formal/UI_Project/TV_UIProject/Languages"
elif "formal" in strUiPorject:
filterPath = "aps/application/radisson/formal"
strUilPath = "aps/application/radisson/formal/UI_Project/TV_UIProject_new/Languages"
else:
filterPath = "aps/application/radisson/%s" % strUiPorject
strUilPath = "aps/application/radisson/%s/UI_Project/TV_UIProject/Languages" % strUiPorject
gamePath = "aps/game" listPath = [filterPath,gamePath] def filterUsefulString():
listStrId = []
for path in listPath:
for dirPath, dirNames, fileNames in os.walk(path):
for sourceFile in fileNames:
filePath = dirPath+"/"+sourceFile
if (re.search(".*\.c.*",sourceFile) or re.search(".*\.h.*",sourceFile)) \
and sourceFile != "TV_strid.h":
for line in open(filePath,"r"):
if "TV_IDS_String" in line:
if line.count("TV_IDS_String") > 2:
print "\n\nthe number of string are more than 2 in a row \n\n "
print sourceFile
print "\n"
continue
if re.search(".*TV_(IDS_String\w*).*TV_(IDS_String\w*).*",line):
tupleStr=re.search(".*TV_(IDS_String\w*).*TV_(IDS_String\w*).*",line).groups()
for i in range(len(tupleStr)):
setStr.add(tupleStr[i])
else:
setStr.add(re.search(".*TV_(IDS_String\w*).*",line).group(1))
elif "TV_IDS_Game_Menu_OSD_String" in line:
setStr.add("IDS_Game_Menu_OSD_String") print "\n\n程序中共使用 %d 个字串。\n保存在当前目录 UsedString.h-文件中\n\n" % len(setStr)
for line in setStr:
listStrId.append(line)
listStrId.append("\n")
open("UsedString.h","w").writelines(listStrId) '''
#读EXCEL到映射表
def excelSetting()
setElStr = set()
mapStr = {}
listFirst = []
setDiff = set()
book = xlrd.open_workbook(r'Languages.xls')
sheet = book.sheet_by_index(0) listFirst = sheet.row_values(0) for row in range(sheet.nrows):
cellStr = str(sheet.cell(row,0).value)
cellStr.rstrip()
if cellStr in setStr:
mapStr[cellStr] = sheet.row_values(row) #setElStr = set(mapStr.keys())
#setDiff = setElStr - setStr #写EXCEL
wboot = xlwt.Workbook()
sheet = wboot.add_sheet("Language")
#操作第一行,抬头
for col in range(len(listFirst)):
sheet.write(0,col,listFirst[col]) #其它行
row = 1
for (k,v) in mapStr.items():
for col in range(len(v)):
sheet.write(row,col,v[col])
row = row + 1
wboot.save(r'Language_.xls') '''
#处理UIL文件,对比setStr集合,删除无用字串
def deleteString():
delCount = 0
lanList = []
for dirPath,dirNames,fileNames in os.walk(strUilPath):
for sourceFile in fileNames:
filePath = dirPath + "/" + sourceFile
for line in open(filePath,"r"):
#==============================================#
#有些字串在code中是以偏移量的方式使用,不能删除
if "IDS_String_GMT_" in line:
lanList.append(line)
continue
elif re.search(".*IDS_String_\d{1,2}\".*",line) or ("IDS_String_LNB" in line):
lanList.append(line)
continue
# ==============================================# if "<String ID=" in line:
if re.search("\s*<String ID=\"(\w*)\".*",line).group(1) in setStr:
lanList.append(line)
else:
delCount = delCount+1
else:
lanList.append(line)
open(filePath,"w").writelines(lanList)
print(sourceFile + "删除 %s" %delCount)
lanList = []
delCount = 0 #处理UIL文件,迭代lanFist集合,标记字串放在UIL文件前面
def priorityString():
lanFist = []
lanList1 = []
lanList2 = []
lanList3 = []
pat = re.compile(".*\"(IDS_String\w*)\".*")
for line in open(strUilPath+"/English.uil","r").readlines():
if strMark in line and pat.search(line):
lanFist.append(pat.search(line).group(1))
open("PrimaryString.h", "a").writelines([x + "\n" for x in lanFist])
print "优先级字串共%d,如下:" %len(lanFist)
print lanFist for dirPath, dirNames, fileNames in os.walk(strUilPath):
for sourceFile in fileNames:
filePath = dirPath + "/" + sourceFile
for line in open(filePath, "r"):
if pat.search(line) and pat.search(line).group(1) in lanFist:
line = line.replace(strMark,"")
lanList1.append(line)
elif "IDS_String_spliteLine" in line:
lanList3.append(line)
else:
lanList2.append(line)
if(len(lanList1) and len(lanList2)>=3):
lanList2 = lanList2[0:2] +lanList1 + lanList3+lanList2[2:]
open(filePath, "w").writelines(lanList2)
lanList1 = []
lanList2 = [] #给已整理好优先级高的字串添加strMark
def AddMark():
StringList = []
a = 0
for line in open(strUilPath+"/English.uil","r") :
if ("<String ID=" in line):
if re.search("IDS_String_spliteLine",line):
a = 1
elif(a == 0):
line = line.replace('Value="','Value="'+strMark)
StringList.append(line)
open(strUilPath+"/English.uil","w").writelines(StringList)
print "\n添加StrMark完成\n" #读取 优先级字串整理.h 中的字串进行比对添加标记(未整理)
def CompareAddMark():
strSet = set()
strList = []
for line in open("PrimaryString.h", "r"):
strSet.add(re.search(".*(IDS_String_.*).*",line).group(1))
print strSet
for line in open(strUilPath+"/English.uil","r") :
if "<String ID=" in line:
if re.search("\s*<String ID=\"(\w*)\".*", line).group(1) in strSet:
print "a\n"
line = line.replace('Value="','Value="'+strMark)
strList.append(line)
open(strUilPath+"/English.uil","w").writelines(strList) def fun_parse_InputParam():
global g_deleteMode
global g_priorityMode
global g_AddmarkMode
global g_CompareMode
try:
opts, args = getopt.getopt(sys.argv[1:], 'dpac')
except getopt.GetoptError, err:
#print str(err)
sys.exit() for op, value in opts:
if op == "-d":
g_deleteMode = 1
elif op == "-p":
g_priorityMode = 1
elif op == "-a":
g_AddmarkMode = 1
elif op == "-c":
g_CompareMode = 1
else:
print("unhandled option")
sys.exit() if __name__ == "__main__":
fun_parse_InputParam()
if g_deleteMode:
filterUsefulString()
deleteString()
if g_priorityMode:
priorityString()
if g_AddmarkMode:
AddMark()
if g_CompareMode:
CompareAddMark()

  

genstr.py的更多相关文章

  1. python调用py中rar的路径问题。

    1.python调用py,在py中的os.getcwd()获取的不是py的路径,可以通过os.path.split(os.path.realpath(__file__))[0]来获取py的路径. 2. ...

  2. Python导入其他文件中的.py文件 即模块

    import sys sys.path.append("路径") import .py文件

  3. import renumber.py in pymol

    cp renumber.py /usr/local/lib/python2.7/dist-packages/pymol import renumber or run /path/to/renumber ...

  4. python gettitle.py

    #!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...

  5. 解决 odoo.py: error: option --addons-path: The addons-path 'local-addons/' does not seem to a be a valid Addons Directory!

    情况说明 odoo源文件路径-/odoo-dev/odoo/: 我的模块插件路径 ~/odoo-dev/local-addons/my-module 在my-module中创建了__init__.py ...

  6. caffe机器学习自带图片分类器classify.py实现输出预测结果的概率及caffe的web_demo例子运行实例

    caffe机器学习环境搭建及python接口编译参见我的上一篇博客:机器学习caffe环境搭建--redhat7.1和caffe的python接口编译 1.运行caffe图片分类器python接口 还 ...

  7. 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优

    libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...

  8. MySqlNDB使用自带的ndb_setup.py安装集群

    在用Mysql做集群时,使用Mysql的NDB版本更易于集群的扩展,稳定和数据的实时性. 我们可以使用Mysql自带的工具进行集群安装与管理:ndb_setup.py.位于Mysql的安装目录bin下 ...

  9. 将做好的py文件打包成模块,供别人安装调用

    现在要将写完的3个py文件,打包. 步骤: 1.新建一个文件夹setup(名字随便取),在setup文件夹下,再新建一个文件夹financeapi. 2.将上面4个py文件拷贝至financeapi文 ...

随机推荐

  1. POJ P3352 Road Construction 解题报告

    P3352 Road Construction 描述 这几乎是夏季,这意味着它几乎是夏季施工时间!今年,负责岛屿热带岛屿天堂道路的优秀人士,希望修复和升级岛上各个旅游景点之间的各种道路. 道路本身也很 ...

  2. 【bzoj3438】 小M的作物

    http://www.lydsy.com/JudgeOnline/problem.php?id=3438 (题目链接) 题意 $n$种作物,每种可以种在A田也可以种在B田,两种种植方法有不同的收益.$ ...

  3. 端午漫谈(附:Ubuntu18.04下轻量截图软件)

    先说声端午快乐- 有空就陪陪家人吧.今天陪外公吃了顿饭,陪老人家聊了会天,颇有点感触.发现技术真的是改变生活,小孩抖音自学跳舞,大人微信刷又刷,很多天海一方的老朋友都可以联系到了... 其实最有感触的 ...

  4. 【POJ1179】Polygon 区间DP

    这道题是典型的环形石子归并模型,破环成链后时间复杂度为\(O(n^3)\) 不过,因为题目中所给的数字可能是负数,仅仅记录区间内合并之后的最大值并不满足动态规划的最优子结构性质.因此,还需要额外记录下 ...

  5. share.js一键分享到微博、QQ空间、QQ好友、微信、腾讯微博、豆瓣、Facebook、Twitter、Linkedin、Google+、点点等

    官网上面 https://github.com/overtrue/share.js非常详细的介绍了share.js他的使用 使用方式有:第一:使用 npm npm install social-sha ...

  6. JS面试题(一)

    1.JS六种基本数据类型:string Boolean number object undefined function typeof返回的是字符串,有六种:string Boolean number ...

  7. 把pandas dataframe转为list方法

    把pandas dataframe转为list方法 先用numpy的 array() 转为ndarray类型,再用tolist()函数转为list

  8. go 基础(二)

    strings和strconv使用 1.strings使用 strings.HasPrefix(s string, prefix string) bool:判断字符串s是否以prefix开头. str ...

  9. 标准遗传算法(二进制编码 python实现)

    代码地址:https://github.com/guojun007/binary_sga 种群初始化: binary_sga/population_init/population_init.py #种 ...

  10. vue props的理解

    vue用了这么久,今天发现父子组件还是傻傻的分不清,不过还好,今天终于搞懂了 vue中到底什么是父组件,什么是子组件 vue之props父子组件之间的谈话 简单的理解就是:使用的地方是父组件,定义的地 ...