做一個代碼統計工具: 要求: 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'))