由于最近在处理项目优化的问题,其实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函数的行数统计。
网友评论