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


    #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()
  • 相关阅读:
    mysql删选某列重复值
    apache伪静态
    nginx的伪静态
    如何对数据库进行优化
    ci的优缺点
    memcache状态说明
    sql中扩展插入语法
    若给个 个人收款的二维码,如何测试?
    安装自动化测试工具selenium
    PHP 线上项目 无法操作
  • 原文地址:https://www.cnblogs.com/xiaoxiao075/p/10186834.html
Copyright © 2020-2023  润新知