python 遍历toast msg文本

作者: nothingwxq | 来源:发表于2017-03-01 15:57 被阅读172次

    背景

    最近有个简单的迭代需求,需要统计下整个项目内的Toast的msg, 这个有人说直接快捷键查找下,但这里比较坑爹的是项目中查出对应的有1000多处。妈呀,自己查找,还要根据查找id找到对应string,比较坑。于是就顺带练手写了个python脚本来处理这个问题。当然编码相对不太规范,异常处理也没做。由于lz好久没写过python脚本了,相当生疏。几乎是边查文档编写,记录写编写过程:

    1. 查找目录下所有java文件
    2. 查找Java文件中含有Toast相关的行
    3. 在对应行中找出对应的id
    4. 使用id在String中查找对应的toast提示信息。

    简易语法介绍

    1. 函数定义 def 函数名,可以返回元组。
    2. 分号可以省略,通过换行来区分
    3. 变量不需要提前声明
    4. if和for语句是这个样子滴:
     for node in root:
    
     if node.attrib.has_key("name") > 0  :
    
    
    1. 导库:import os

    2. 执行开始的地方还是main函数,后面会有。

    1. 查找目录下所有java文件

    这个我是直接copy网上递归遍历的,省略。

    查找Java文件中的Toast

    需要找出Toast的特征,项目中有两个Toast类 BannerTips和ToastUtils 两个类。
    1.先代码过滤对应的行。找到BannerTips、ToastUtils调用的地方
    2.找出提示的地方
    3.观察其实项目中的id的前面均含有R.string. 可以以此作为区分。

    在对应行中找出对应的id

    使用id在String中查找对应的toast提示信息。

    最后去重。

    最后一个比较简单,可以自己写,也可以解析下xml写。

    import xml.etree.ElementTree as ET
        tree = ET.ElementTree(file = '' + xmlFile)
        root = tree.getroot()
        for node in root:
          if node.attrib.has_key("name") > 0  :
            if(node.attrib['name'] == msg):
              out.write(":%s\n" % node.text.encode('utf-8'))
    

    贴下代码

    import os
    import xml.etree.ElementTree as ET
    
    def findStr(out, msg,fullname):
        xmlFile = 'xx/src/main/res/values/radio_strings.xml'
        strInfos = open(xmlFile,'r+')
        tree = ET.ElementTree(file = '' + xmlFile)
        root = tree.getroot()
        for node in root:
          if node.attrib.has_key("name") > 0  :
            if(node.attrib['name'] == msg):
              out.write("%s\n" % node.text.encode('utf-8'))
    
    def findJava(fullname,out):
      file= open(fullname, 'r+')
      for line in file:
        newline = line.strip()
        if(newline.find("ToastUtils.") != -1):
          lineTexts = newline.split(',')
          if(len(lineTexts) <= 1):
              continue
          linetxt = lineTexts[1]
          aa = linetxt.strip().replace(');', '')
          aa = aa.replace(')', '')
          if(aa.find('R.string.') != -1):
            msgs = aa.split('R.string.')
            if(len(msgs) <= 1):
              continue
    
            msg = msgs[1]
            msg = msg.replace(' :', '');
            if(msg.find('?') == -1):
              if not msg:
                  continue
              findStr(out, msg, fullname)
            else:
              if not msg:
                  continue
              findStr(out, msg, fullname)
              if(len(msgs) >=2):
                findStr(out, msgs[1], fullname)
    
    
      outDel = open('XX/android_dialogMsg.txt')
      output = open('XX/android_dialog_msg.txt','r+')
      s = set()
      for i in outDel:
          s.add(i)
      for li in s:
          output.write(li)
      outDel.close()
      output.close()
      file.close()
    
    def ListFilesToTxt(dir,file,wildcard,recursion):
        exts = wildcard.split(" ")
        files = os.listdir(dir)
        for name in files:
            fullname=os.path.join(dir,name)
            if(os.path.isdir(fullname) & recursion):
                ListFilesToTxt(fullname,file,wildcard,recursion)
            else:
                for ext in exts:
                    if(name.endswith(ext)):
                        findJava(fullname, file)
                        break
    def Test():
      dir = "xxx"
      outfile='XX/android_dialogMsg.txt'
      wildcard = ".java"
    
      file = open(outfile,"w")
      if not file:
        print ("cannot open the file %s for writing" % outfile)
      ListFilesToTxt(dir,file,wildcard, 1)
    
      file.close()
    
    if __name__ == '__main__':
             Test()
    
    

    相关文章

      网友评论

        本文标题:python 遍历toast msg文本

        本文链接:https://www.haomeiwen.com/subject/khytwttx.html