統計代碼文件中的實際有效行數,去掉空行、單行注釋、多行注釋


#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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM