1. 程式人生 > >統計程式碼檔案中的實際有效行數,去掉空行、單行註釋、多行註釋

統計程式碼檔案中的實際有效行數,去掉空行、單行註釋、多行註釋

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