欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

20190227-做一个简易代码统计工具

程序员文章站 2022-06-22 12:55:03
做一个代码统计工具: 要求: 1.如果是文件,就直接统计文件行数,并打印结果 2.判断是否是目录,是就遍历统计目录下所有的文件文件统计规则: 1.开头是#_*_或者#encoding的需要算作代码统计 2.注释#,'''或者"""判断某一行开头是"""或者'''就不计 3.空行不统计 4.统计当前文 ......

做一个代码统计工具:

要求:
  1.如果是文件,就直接统计文件行数,并打印结果
  2.判断是否是目录,是就遍历统计目录下所有的文件
文件统计规则:
  1.开头是#_*_或者#encoding的需要算作代码统计
  2.注释#,'''或者"""判断某一行开头是"""或者'''就不计
  3.空行不统计
  4.统计当前文件行数,还有累计行数

要求算法:

  1.判断是否是文件,且文件存在,则打开文件进行统计

  2.判断是目录,则变量目录下所有的文件,进行统计

统计规则算法

  1.注释种类有如下几种:

    a.以#开头进行单行注释

#xxxxx

    b.以三个双引号"""开头和结尾的单行注释

"""xxxxx"""
'''xxxxx'''

    c.以三个双引号或者单引号开头换行进行注释格式如下:

"""
xxxxx
"""
'''
xxx
'''

    d.以三个双引号或者单引号开头不换行进行注释格式如下:

"""xxxxx
"""
'''xxxxx
'''

    e.以三个双引号或者单引号结尾不换行进行注释格式如下:

"""
xxxxx"""
'''
xxxxx'''

根据以上多行注释情况,考虑设置标志位,当标志位是true的时候统计代码,当标志位是false的时候不统计,注意考虑标志位还原的情况编写统计规则如下:

def coding_rule(filename):
    count = 0
    import string
    with open(filename,'r',encoding ='utf-8') as fp:
        flag = true
        for line in fp:
            #print(line)
            if line.strip().startswith('#encoding') or line.strip().startswith('#_*_'):
                count+=1
                #统计开头是#_*_或者#encoding的代码
            elif not line.strip():
                continue
                #如果是空行,则不计
            elif line.strip().startswith('#'):
                #如果是单行注释格式如#xxx,则不统计,匹配a的情况
                continue
            elif line.strip().startswith('"""') and line.strip().endswith('"""') and len(line.strip())>3:
                #如果是单行注释格式如"""xxx""",则不统计,匹配b的情况
                continue
            elif line.strip().startswith("'''") and line.strip().endswith("'''") and len(line.strip())>3:
                continue
                #如果是单行注释格式如'''xxx''',则不统计,匹配b的情况
            elif line.strip().startswith("'''") and len(line.strip())==3 and flag ==true:
                #如果是以三个单引号'''开始进行注释的,设置标志位为false,匹配c的情况
                flag =false
                continue
            elif line.strip().startswith('"""') and len(line.strip())==3 and flag ==true:
                #如果是以三个双引号"""开始进行注释的,设置标志位为false,匹配c的情况
                flag =false
                continue
            elif line.strip().startswith('"""') and not line.strip().endswith('"""'):
                #如果是三个双引号开头不换行进行注释,设置标志位为false,匹配d的情况
                flag =false
                continue
            elif line.strip().startswith("'''") and not line.strip().endswith("'''"):
                #如果是三个单引号引号开头不换行进行注释,设置标志位为false,匹配d的情况
                flag =false
                continue
            elif not line.strip().startswith('"""') and line.strip().endswith('"""'):
                #如果以三个双引号结尾不换行进行注释,还原标志位为true,匹配e的情况
                flag =true
            elif not line.strip().startswith("'''") and line.strip().endswith("'''"):
                #如果以三个单引号结尾不换行进行注释,还原标志位为true,匹配e的情况
                flag =true
            elif line.strip().startswith("'''") and len(line.strip())==3 and flag ==false:
                #如果是三个单引号引号开头不换行进行注释,还原标志位为true,匹配d的情况
                flag =false
                flag =true
            elif line.strip().startswith('"""') and len(line.strip())==3 and flag ==false:
                #如果是三个单引号引号开头不换行进行注释,还原标志位为true,匹配d的情况
                flag =false
                flag =true
            elif flag ==true:
                count+=1
            #print(flag)
            #print(count)
    return count

另外写一个函数,来写代码统计的要求部分,如下:

def coding_count(*source_dir):
    import os
    result ={}
    total_count =0
    except_file=[]
    for source in source_dir:
        if os.path.exists(source) and (source[-2:]=='py' or source[-3:]=='txt'):
            #如果文件存在,且是.py文件
            result[source]=coding_rule(source)
            total_count +=coding_rule(source)
        #读文件
        elif os.path.exists(source) and os.path.isdir(source):
            #如果输入的dir是一个目录,且存在
            for root,dirs,files in os.walk(source):
                #print('当前目录:%s'%root)
                for file in files:
                    file_dir = os.path.join(root,file)
                    if os.path.basename(file)[-2:]=='py' or os.path.basename(file)[-3:]=='txt':
                        try:
                            result[file]=coding_rule(file_dir)
                            total_count +=coding_rule(file_dir)
                        except:
                            except_file.append(file)
        result['total']=total_count
    return result,except_file
#print(coding_count(r'c:\users\何发奋\desktop\python 习题\a.txt',r'c:\users\何发奋\desktop\python 习题\习题库'))
print(coding_count(r'c:\users\何发奋\desktop\python 习题\a.txt'))