递归实现的一个小项目----实现代码数目的统计(python实现)

递归实现的一个小项目----实现代码数目的统计(python实现)

嗯。。。程序可能会有一些小BUG,比如并不能检测多行注释,而且运行效果不是太美观(因为并没有用面向对象做程序,,所以就只能用DOS了。

  1. 本源码只能检测C语言Python的代码行数,有兴趣可以改正源码去统计其他语言,这里不做这方面改进。
  2. 在源码中有这么一行:
if i=="venv":#检测文件名称是否为venv,如果是的话就不去检查代码行数,应为这是系统自动的.
            continue

是因为该文件夹内的代码是系统自动生成的,所以这里做屏蔽措施,C语言的项目可能也会自动生成相关的cpp的文件,这里并没有屏蔽(因为我写的代码都没有用项目。。。。小白一个),有兴趣自己加入相关屏蔽代码。
本博文持续更新,以后会让这个小程序更加友好。。

程序效果:

(为了截图效果,这里只分段截图。。)
在这里插入图片描述

给出代码:

#进行查找代码的小程序


'''
写代码的过程中学到的:
os.path.splitext(path)	分割路径,返回路径名和文件扩展名的元组
os.path.isdir(path)	判断路径是否为目录

报错解决办法:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 52: invalid continuation byte
把 encoding = 'utf-8'改为encoding='ISO-8859-1'
遇到在程序中访问全局变量并且要修改全局变量的值的情况可以使用:global关键字,在函数中声明此变量是全局变量

'''


import os
import os.path as op
import time

sum = [0,0,0,0,0]#记录总共写了多少行代码,第四行为python的代码,第五行为C代码
c_sum = [0,0,0]# 记录c的代码行数,第一个元素为总代码行数,第二个为空行数,第三个为注释数
p_sum = [0,0,0] #记录pyhon的代码行数,第一个元素为总代码行数,第二个为空行数,第三个为注释数
files_sum = [0,0,0]#存放的是这个文件夹里面的总代码行数

def open_file(name,sign_explain):#用来打开一个文件,第二个参数是注释的符号(因为C的与python的不同)
    each_num = [0,0,0]#存放这个文件的代码数,元素规则同上面的
    print("正在查找{:s}".format(name))
    time.sleep(0.1)#此处延时0.1s
    
    
    with open(name,'r',encoding='ISO-8859-1') as f:
        text = f.readlines()#按照行来存放了代码
    for each in text:
        if each == "\n":#如果是空行的话
            each_num[1] +=1
            
        if sign_explain in each:
            each_num[2] += 1
        each_num[0] +=1
    #print('在' + name+ "的文件中中,您一共写了{0:d}行代码,实际代码行数{1:d},其中{2:d}行空行,{3:d}行注释".\
          #format(each_num[0],(each_num[0] - each_num[1]),each_num[1],each_num[2]))
    return each_num

def open_files(adress):#用来打开多个文件夹
    global sum
    global c_sum
    global p_sum
    dir = os.listdir(adress)#存储当前文件夹内的文件名和目录
    global files_sum
    if len(dir) ==0 :
        #print( adress + "是一个空文件夹")
        return
    for i in dir:
        if i=="venv":#检测文件名称是否为venv,如果是的话就不去检查代码行数,应为这是系统自动的.
            continue
        dir_adress = adress +'\\' +  i#为完整的文件路径
        
        if op.isdir(dir_adress):#通过这个操作来判断是否需要递归

            open_files(dir_adress)#把这个有目录的文件进行递归
        
        
  
        
        file_type = op.splitext(dir_adress)#存放文件及其类型(后缀)
        if file_type[1]=='.py':#判断是否是py文件
            p_tmp_sum = [0,0,0]
            p_tmp_sum = open_file(dir_adress,"#")#临时存放
            p_sum[0] += p_tmp_sum[0]
            p_sum[1] += p_tmp_sum[1]
            p_sum[2] += p_tmp_sum[2]
            
           #print("      " + dir_adress)
        elif file_type[1]=='.c':#判断是否是C文件
            c_tmp_sum = [0,0,0]
            c_tmp_sum = open_file(dir_adress,r"\\")#临时存放
            c_sum[0] += c_tmp_sum[0]
            c_sum[1] += c_tmp_sum[1]
            c_sum[2] += c_tmp_sum[2]
            #print("      " + dir_adress)
        
    files_sum[0] = c_sum[0] + p_sum[0]
    files_sum[1] = c_sum[1] + p_sum[1]
    files_sum[2] = c_sum[2] + p_sum[2]
    #总代码数加
    sum[0] +=files_sum[0]
    sum[1] +=files_sum[1]
    sum[2] +=files_sum[2]
    sum[3] +=p_sum[0]
    sum[4] +=c_sum[0]
    
    '''
    #打印一下这个文件夹里面一共写了多少行代码什么的
    print('在' + adress + "的目录中,您一共写了{0:d}行代码,实际代码行数{1:d},其中{2:d}行空行,{3:d}行注释".\
    format(files_sum[0],(files_sum[0] - files_sum[1]),files_sum[1],files_sum[2]))
    print("其中C语言代码有{:d}行,python代码有{:d}行".format(c_sum[0],p_sum[0]))
    '''
    files_sum = [0,0,0]
    p_sum= [0,0,0]
    c_sum=[0,0,0]
    return 
            

        

def main():#主函数
    adress = input("请输入您要查询的文件夹地址(eg.C:\\Users\\admin\\Desktop\\Python(1)):\n")
    open_files(adress)
    print("经过统计,您一共写了{0:d}行代码,实际代码行数{1:d},其中{2:d}行空行,{3:d}行注释".\
    format(sum[0],(sum[0] - sum[1]),sum[1],sum[2]))
    print("其中C语言代码有{:d}行,python代码有{:d}行".format(sum[4],sum[3]))
    print("您差10W行代码才完成了{:0.2f}%还差:{:d}行代码".format((sum[0] - sum[1])/1000,100000 - sum[0]))
    input()
    return

#进行异常检测
try :
    main()
    
except:
    print("请检测你的输入目录是否有效!")

代码可能存在严重漏洞,,博主小白,欢迎共同学习交流!

猜你喜欢

转载自blog.csdn.net/qq_33950926/article/details/90407705