美文网首页
python抓取iOS项目里m文件里各方法的行数

python抓取iOS项目里m文件里各方法的行数

作者: 十一岁的加重 | 来源:发表于2018-08-01 16:35 被阅读55次

由于最近在处理项目优化的问题,其实Jenkins上也有文件行数的统计,不过是针对单个文件的,当然这是一点优化的方向。
其实如果能统计到项目里所有的方法的行数排行,也对优化或者抽取有一定帮助。
花了一些时间实现了功能,但是目前没有考虑到C函数,只考虑了类方法和对象方法。

# coding=utf-8

import os                           
import sys
import re   
import linecache
import json
from operator import itemgetter


def getFileMethdLineCountArray(iOSUrlFilePath):
    arr = []
    fileLineCount = -1
    iOSUrlFile_object = open(iOSUrlFilePath, 'rU')
    methodName = ''
    for count,line in enumerate(open(iOSUrlFilePath,'r')):
        fileLineCount += 1

    try: 
        for lineIdx,line in enumerate(iOSUrlFile_object):
            # 去除空格,换行符,制表符
            line = "".join(line.split())
            #判断是否是空行或注释行
            if not len(line)  or line.startswith('/*') or line.startswith(' *') or line.startswith('>>>'):  
                continue
            elif line.startswith('+(') or line.startswith('-(') :
                # 方法类型:类方法、对象方法
                methodTypeStr = line[0:1]
                methodName = line.replace('{', "")
                iOSFileName = iOSUrlFilePath.split('/')[-1]
                iOSFileName = iOSFileName.replace('.m', '')
                arr.append({iOSFileName+methodName:lineIdx});
            elif lineIdx == fileLineCount:
                arr.append({'fileLineCount':lineIdx});
    finally:
        iOSUrlFile_object.close()
    if arr[-1].has_key('fileLineCount'):
        pass
    else:
        fileLineCount = -1
        for count,line in enumerate(open(iOSUrlFilePath,'r')):
            fileLineCount += 1
        arr.append({'fileLineCount':fileLineCount})
    # 处理行数
    for idx, dict in enumerate(arr):
        if idx == len(arr) -1:
            pass
        elif idx == len(arr) -2:
            
            fileLineCount = arr[-1]['fileLineCount']
            key = next(iter(dict))
            lastValue = fileLineCount - dict[key] - 2
            dict[key] = lastValue;
        else:
            key = next(iter(dict))
            nextDict = arr[idx+1]
            nextKey = next(iter(nextDict))
            dict[key] = nextDict[nextKey] - dict[key] - 2;
    # 移除最后一个字典{'fileLineCount':文件总行数}     
    arr.pop()
    return arr;

sourcePath = '项目源码的文件夹路径'
path = sourcePath+''
arrT = []
for dirpath, dirname, filenames in os.walk(path):   
    
    for filename in filenames:
      if filename.count('.m') > 0:
        filePath = os.path.join(dirpath, filename)
        MacroWithCountDicts = getFileMethdLineCountArray(filePath)
        arrT += MacroWithCountDicts
        
# 数组转换成字典
outDict = {}
for dict in arrT:
    key = next(iter(dict))
    outDict[key] = dict[key]      
# 根据value,也就是宏调用次数进行排序,排序后变成数组,引用http://blog.leanote.com/post/shenweiyan/python-sorted
outDict = sorted(outDict.items(), key=lambda item:item[1], reverse=True)
print json.dumps(outDict, ensure_ascii=False, encoding='UTF-8')

运行脚本后,终端会打印一个数组,这时候粘贴到这个网站
https://www.json.cn/
就看到效果了。后续会考虑C函数的行数统计。

image.png

相关文章

网友评论

      本文标题:python抓取iOS项目里m文件里各方法的行数

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