import easygui as g
import os
codingdict = {}
typedict = {}
linecountdict = {}
def ChoiceCountType():
'''選擇要統計哪些代碼檔案型別'''
global codingdict
global typedict
global linecountdict
choices = [".py", ".c", ".cpp", ".txt", ".cs", ".aspx"] # 設定代碼檔案選項
usertype = g.multchoicebox(msg="請從下列串列中選擇要統計的代碼檔案型別!", title="代碼統計", choices=choices)
codingdict = dict.fromkeys(usertype, [0, 0]) # 給型別字典賦初值 {型別,[個數,有效代碼數]}
# typedict=dict.fromkeys(usertype,0)
# linecountdict=dict.fromkeys(usertype,0)
dirpath = g.diropenbox()
# print(codingdict)
return dirpath
def calc_code(paths, file_name):
'''統計有效代碼行的函式'''
codinglines = 0
with open(paths + "\\" + file_name, errors="ignore") as fp:
print('正在分析檔案:%s ...' % file_name)
dateline = fp.readlines()
for line in dateline:
if line == "\n":
continue
elif line.startswith("#"):
continue
else:
codinglines += 1
return codinglines
def ChoiceDir(dirpath):
'''用os.walk()遍歷計算檔案數量和有效代碼數分別存進對應串列中'''
# global typedict
# global linecountdict
global codingdict
for paths, dirs, files in os.walk(dirpath):
if len(files) > 0: # 如果有檔案,就執行下一步的遍歷檔案串列
for file in files:
ext = os.path.splitext(file)[1] # 切片出型別,然后判斷出型別在不在編程型別檔案里
if ext in codingdict.keys(): # 如果切出來的型別在字典的KEY中
lines = calc_code(paths, file) # 統計當前檔案有效行數
codingdict[ext][1] += lines #字典[當前檔案型別][該型別有效行數]自增lines
codingdict[ext][0] += 1 #字典[當前檔案型別][該型別檔案個數]自增1
def ShowResult():
msg = ""
text = ""
title = "統計結果"
totallines = 0
chaju = 0
for each in codingdict.keys():
text+=(f"[{each}]型別的檔案有{codingdict[each][0]}個,共計有效代碼量{codingdict[each][1]}行\n")
totallines+=codingdict[each][1]
jindu = "%.2f %%" % (totallines / 1000)
if (100000 - totallines) <= 0:
msg = f"您目前共累積撰寫了{totallines}行代碼,完成進度:{jindu}\n你已經完成了10萬行代碼的代碼量,牛逼的喲!"
else:
chaju = 100000 - totallines
msg = f"您目前共累積撰寫了{totallines}行代碼,完成進度:{jindu}\n離 10 萬行代碼還差{chaju}行,請繼續努力!"
g.textbox(msg, title, text)
# 主程式
openpath = ChoiceCountType()
ChoiceDir(openpath)
ShowResult()
斷點測驗了下,問題應該是出在了
for paths, dirs, files in os.walk(dirpath):
if len(files) > 0: # 如果有檔案,就執行下一步的遍歷檔案串列
for file in files:
ext = os.path.splitext(file)[1] # 切片出型別,然后判斷出型別在不在編程型別檔案里
if ext in codingdict.keys(): # 如果切出來的型別在字典的KEY中
lines = calc_code(paths, file) # 統計當前檔案有效行數
codingdict[ext][1] += lines #字典[當前檔案型別][該型別有效行數]自增lines
codingdict[ext][0] += 1 #字典[當前檔案型別][該型別檔案個數]自增1
這段代碼里,原本想象是每遍歷一個檔案,如果ext在key里,那codingdict[對應檔案后綴][0](檔案個數)及[1](該型別有效行數)都對應的增加。
斷點測驗時發現是字典里所有key對應的值都增加了,并不是對應的檔案型別增加。老哥們這個得咋整?
uj5u.com熱心網友回復:
codingdict = dict.fromkeys(usertype, [0, 0]) ==>codingdict = dict.fromkeys(usertype, None)
#加一行
codingdict[ext] = [0, 0] if codingdict[ext] == None else codingdict[ext]
codingdict[ext][1] += lines #字典[當前檔案型別][該型別有效行數]自增lines
codingdict[ext][0] += 1
uj5u.com熱心網友回復:
d_list = [ d.strip() for d in codingdict.keys().splitlines() ]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/19826.html
上一篇:做一些資料處理時出現下面報錯,請問如何修改,萬分感謝!!!(腳本和報錯都貼出了)
下一篇:Python 特殊字符轉義
