Python实现删除Android工程中的冗余字符串


Posted in Python onJanuary 19, 2015

Android提供了一套很方便的进行资源(语言)国际化机制,为了更好地支持多语言,很多工程的翻译往往会放到类似crowdin这样的平台上。资源是全了,但是还是会有一些问题。

哪些问题

以下使用一些语言进行举例。其中values为工程默认的资源。

1.某语言的资源和某语言限定区域的资源之间。如values-fr-rCA存在于values-fr相同的字符串,这种表现最为严重。
2.某语言的资源和默认的资源之间。values-fr存在与values相同的字符串,可能原因是由于values-fr存在未翻译字符串导致

为什么要去重

洁癖,容不下半点冗余。

解决思路

1.如果values-fr-rCA存在于values-fr相同的字符串,去除values-fr-rCA中的重复字符串,保留values-fr。这样可以保证在values-fr-rCA下也可以正确读取到资源。

2.如果values-fr存在与values相同的字符串。如去除values-fr中得重复字符串,保留values的条目。

Py脚本

#!/usr/bin/env python

# coding=utf-8

from os import listdir,path, system

from sys import argv

try:

    import xml.etree.cElementTree as ET

except ImportError:

    import xml.etree.ElementTree as ET


def genRegionLangPair(filePath):

    basicLanguage = None

    if ('values' in filePath) :

        hasRegionLimit = ('r' == filePath[-3:-2])

        if (hasRegionLimit):

            basicLanguage = filePath[0:-4]

            if (not path.exists(basicLanguage)) :

                return None

            belongsToEnglish =  ("values-en" in basicLanguage)

            if (belongsToEnglish):

                #Compare with the res/values/strings.xml

                return (path.dirname(basicLanguage) + '/values/strings.xml', filePath + "/strings.xml")

            else:

                return (basicLanguage + '/strings.xml', filePath + "/strings.xml")

    return None
def genLangPair(filePath):

    def shouldGenLanPair(filePath):

        if (not 'values' in filePath ):

            return False

        if('dpi' in filePath):

            return False

        if ('dimes' in filePath):

            return False

        if ('large' in filePath):

            return False

        return True
    if(shouldGenLanPair(filePath)):

        basicLanguage = path.dirname(filePath) + '/values/strings.xml'

        targetLanguage = filePath + '/strings.xml'

        if (not path.exists(targetLanguage)):

           return None
        if (not path.samefile(basicLanguage,targetLanguage)) :

            return (basicLanguage, targetLanguage)

    return None
def genCompareList(filePath):

    compareLists = []

    for file in listdir(filePath):

        regionPair = genRegionLangPair(filePath + '/' + file)

        if (None != regionPair):

            compareLists.append(regionPair)
        languagePair = genLangPair(filePath + '/' + file)

        if (None != languagePair) :

            compareLists.append(languagePair)
    return compareLists
def getXmlEntries(filePath):

    root = ET.ElementTree(file=filePath).getroot()

    entries = {}

    for child in root:

        attrib = child.attrib

        if (None != attrib) :

            entries[attrib.get('name')] = child.text

    print 'xmlEntriesCount',len(entries)

    return entries
def rewriteRegionFile(sourceEntries, filePath):

    if (not path.exists(filePath)):

        return

    ET.register_namespace('xliff',"urn:oasis:names:tc:xliff:document:1.2")

    tree = ET.ElementTree(file=filePath)

    root = tree.getroot()

    print root

    totalCount = 0

    removeCount = 0

    unRemoveCount = 0

    print len(root)

    toRemoveList = []

    for child in root:

        totalCount = totalCount + 1

        attrib = child.attrib

        if (None == attrib):

            continue
        childName = attrib.get('name')
        if (sourceEntries.get(childName) == child.text):

            removeCount = removeCount + 1

            toRemoveList.append(child)

        else:

            unRemoveCount = unRemoveCount + 1

            print childName, sourceEntries.get(childName), child.text

    print filePath,totalCount, removeCount,unRemoveCount
    for aItem in toRemoveList:

        root.remove(aItem)
    if (len(root) != 0 ):

        tree.write(filePath, encoding="UTF-8")

    else:

        command = 'rm -rf %s'%(path.dirname(filePath))

        print command

        system(command)

def main(projectDir):

    lists = genCompareList(projectDir + "/res/")
    for item in lists:

        print item

        src = item[0]

        dest = item[1]

        rewriteRegionFile(getXmlEntries(src),dest)
if __name__ == "__main__":

    if (len(argv) == 2) :

        main(argv[1])

如何使用

python removeRepeatedStrings.py your_android_project_root_dir
Python 相关文章推荐
Python画图学习入门教程
Jul 01 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 Python
python导入csv文件出现SyntaxError问题分析
Dec 15 Python
通过python+selenium3实现浏览器刷简书文章阅读量
Dec 26 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
浅谈Python编程中3个常用的数据结构和算法
Apr 30 Python
python开启debug模式的方法
Jun 27 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
Python中sorted()排序与字母大小写的问题
Jan 14 Python
Python基于read(size)方法读取超大文件
Mar 12 Python
Python基于DB-API操作MySQL数据库过程解析
Apr 23 Python
Python Socket编程详解
Apr 25 Python
Python中字典和JSON互转操作实例
Jan 19 #Python
Python中的字典遍历备忘
Jan 17 #Python
Python中处理unchecked未捕获异常实例
Jan 17 #Python
Python实现过滤单个Android程序日志脚本分享
Jan 16 #Python
Python中的对象,方法,类,实例,函数用法分析
Jan 15 #Python
Python转换HTML到Text纯文本的方法
Jan 15 #Python
python中os操作文件及文件路径实例汇总
Jan 15 #Python
You might like
php email邮箱正则
2008/10/08 PHP
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
php打包网站并在线压缩为zip
2016/02/13 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
利用javascript判断文件是否存在
2013/12/31 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
Vue 组件参数校验与非props特性的方法
2019/02/12 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
[08:47]2018国际邀请赛 OG战队举杯时刻
2018/08/29 DOTA
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
python实现泊松图像融合
2018/07/26 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
python实现ip代理池功能示例
2019/07/05 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
Python爬取某平台短视频的方法
2021/02/08 Python
HTML5 本地存储 LocalStorage详解
2016/06/24 HTML / CSS
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
基督教婚礼主持词
2014/03/14 职场文书
节水倡议书范文
2014/04/15 职场文书
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang
python中mongodb包操作数据库
2022/04/19 Python