统计代码文件中的实际有效行数,去掉空行、单行注释、多行注释

#coding=gbk

import os

#rootdir='f:\\pylianxi'
def count_line_core(file_name):  ##传入单个文件,统计行数,之后返回该文件的实际代码行数;区分utf-8、gbk有待优化
    print('core_file_name:',file_name)
    lines_count=0
    flag=True
    try:
        with open(file_name,'r',encoding='gbk') as fp:
            print('gbk file_name:',file_name)
            for i in fp:
                i=i.strip()
                if i=="'''" or i=='"""':
                    if flag==True:
                        flag=False
                        continue
                    else:
                        flag=True
                        continue
                elif (i.startswith("'''") and i.endswith("'''")) or (i.startswith('"""') and i.endswith('"""')):
                    continue
                elif i.startswith("'''") or i.startswith('"""') or i.endswith("'''") or i.endswith('"""'):
                    if flag==True:
                        flag=False
                        continue
                    else:
                        flag=True
                        continue
                if flag==True and i!='' and not i.startswith('#'):
                    lines_count+=1
                    #print(i)
                if i.startswith('#-*-') or i.startswith('#coding') or i.startswith('#encoding'):
                    lines_count+=1
                    #print(i)
    except:
        with open(file_name,'r',encoding='utf-8') as fp:
            print('utf-8 file_name:',file_name)
            for i in fp:
                i=i.strip()
                if i=="'''" or i=='"""':
                    if flag==True:
                        flag=False
                        continue
                    else:
                        flag=True
                        continue
                elif (i.startswith("'''") and i.endswith("'''")) or (i.startswith('"""') and i.endswith('"""')):
                    continue
                elif i.startswith("'''") or i.startswith('"""') or i.endswith("'''") or i.endswith('"""'):
                    if flag==True:
                        flag=False
                        continue
                    else:
                        flag=True
                        continue
                if flag==True and i!='' and not i.startswith('#'):
                    lines_count+=1
                    #print(i)
                if i.startswith('#-*-') or i.startswith('#coding') or i.startswith('#encoding'):
                    lines_count+=1
                    #print(i)
    return lines_count    

def code_line_count(rootdir,filetype):  ##分别处理了传入的路径是单个文件,或者传入的是文件夹
    #rootdir 传的是单个文件
    count_dict={}
    if os.path.isfile(rootdir) and os.path.splitext(rootdir)[1] in filetype:
        file_name=rootdir
        lines_count=count_line_core(file_name)
        return lines_count

    elif os.path.isdir(rootdir):
        for files in os.listdir(rootdir):
            file_name=os.path.join(rootdir,files)
            
            if os.path.splitext(file_name)[1] in filetype:
                print('file_name',file_name)
                lines_count=count_line_core(file_name)
                count_dict[files]=lines_count
                
        sum_1=sum(count_dict.values())
        
        return sum_1,count_dict
            

import sys

if __name__=='__main__':
    if len(sys.argv)<3:
        print('参数数量不对,请输入要统计代码行数的文件路径及文件类型,如.txt .py等!')
        sys.exit()
    if os.path.exists(sys.argv[1]):
        if os.path.isfile(sys.argv[1]):
            print('该文件的代码行数为:',code_line_count(sys.argv[1],sys.argv[2:]))
            
        elif os.path.isdir(sys.argv[1]):
            print('sys.argv[1],sys.argv[2:]',sys.argv[1],sys.argv[2:])
            result=code_line_count(sys.argv[1],sys.argv[2:])
            print('总代码行数为:%s,每个文件代码行数为:%s'%result)
            #for i in result[1]:
            print('*'*20)
            print(sorted(result[1].items(),key=lambda x:x[1]))
                
                

    else:
        print('输入的路径不存在,请重新输入!')
        sys.exit()

 

posted @ 2018-12-27 19:19  小金儿  阅读(2113)  评论(0编辑  收藏  举报