• 写了一个查找你写过多少行代码的python脚本,这个是实验室的同学让我做的,他懒得做(忙的写情书),
    大一上C语言课,老师说四年写够十万行代码,毕业的时候就是大佬。
  • 还想加一点功能,现在的还是在初级阶段,应该还会有很多bug
  • 先贴代码
import os
import codecs

class count_code:
    file_type=["cpp","c","py","java","go"] #用于根据后缀名确定是否为代码文件
    file_avoid=["Android","gcc","go","exe4j","matlab","eric","pycharm","Node.js","Lib","lib",
                "Scripts","scripts","mysql","Tools","资料盘","鱼C工作室编程教学","Web","SDK",
                "IDE","DIA SDK","Apps","MSBuild","VSSDK","MySQL-python","ffmpeg"]
                #这个做的是排除一些文件(主要是包括一些语言头文件和库文件,毕竟这些不是你写的,嘿嘿)
                #此项功能慎重使用
    file_catalog=[]
    count={"cpp":0, "c":0, "py":0, "java":0, "go":0}
    def count_file(self):
        while True:
            file=input("请输入要添加的文件目录:")
            if os.path.exists(file):
                self.file_catalog.append(file)   #初始提供要搜索的文件目录,目前直接搜索单个
                                                 #代码文件还不行,估计是递归写废了,有时间再改
                choose=input("是否继续输入?Y/N\n")
                if choose in ['Y','y']:
                    continue
                elif choose in ['N','n']:
                    break
                else:
                    print("输入有误,请重新输入!")
            else:
                print("输入有误,请重新输入!")
                choose=input("是否继续输入?Y/N\n")
                if choose in ['Y','y']:
                    continue
                elif choose in ['N','n']:
                    break
                else:
                    print("输入有误,请重新输入!")
        #self.file_catalog=set(self.file_catalog)
        self.cal_file("",self.file_catalog)

    def cal_file(self,file_pre,file_catalog):   #递归计算文件目录
        if "$RECYCLE.BIN" in file_catalog:
            file_catalog.remove("$RECYCLE.BIN")

        for i in file_catalog:
            #print(file_catalog)
            #print(i)
            try:
                if i in self.file_avoid:
                    continue
                if file_pre!="" and file_pre[-1]!="\\":
                    file_pre+="\\"
                if os.path.isfile(file_pre+i):
                    #print("----------"+file_pre+i)
                    self.cal_code(file_pre+i)
                else:
                    file_name=(os.listdir(file_pre+i))
                    self.cal_file(file_pre+i,file_name)
            except NotADirectoryError:
                print("***********读取目录发生了错误**********")   #有些文件目录访问会报错,原因目前不知
                continue
            except PermissionError:
                print("***********拒绝访问**********")   #有些文件会拒绝访问,比如".db"的
                                                        #SQL server数据库文件
                continue

    def cal_code(self,file_name):
        suffix=file_name.split('.')[-1]
        if suffix in self.file_type:
            flag=0
            while True:
                try:   #有些文件用"utf-8"解码会失败,我还不太了解为什
                       #么有的解码方式为什么会导致解码失败,干脆全列出来,能解码就解掉
                    if flag==0:
                        f=codecs.open(file_name,'r',"utf-8")
                        #with codecs.open(file_name,'r',"utf-8") as f:
                    elif flag==1:
                        f=codecs.open(file_name,'r',"gbk")
                    elif flag==2:
                        f=codecs.open(file_name,'r',"utf-16")
                    elif flag==3:
                        f=codecs.open(file_name,'r',"gbk2312")
                    else:
                        print("***********解码失败**********")
                        flag=-1
                    lines=f.readlines()
                except UnicodeDecodeError:
                    print("***********尝试另一种解码**********")
                else:
                    print(file_name,len(lines))
                    for i in lines:
                        if i!='\n':
                            self.count[suffix]+=1
                    f.close()
                    #print(self.count[suffix])
                    flag=-1
                finally:
                    if flag==-1:
                        break
                    else:
                        flag+=1
                        #self.count=self.count+len(lines)
    def show_count(self):
        for i in self.count:
            print("后缀名为:"+i+"的代码行数为:",self.count[i],sep="")

if __name__=='__main__':
    mycode=count_code()
    mycode.count_file()
    mycode.show_count()

运行效果如下:

java 文件统计代码行数_库文件

java 文件统计代码行数_文件目录_02

这些代码里还是包括了一些头文件和库文件的,我没有仔细排除

:并不是用不同的解码方式打开文件会出错,而是打开文件后对文件”readline”或者“readlines”等诸如其他的对文件内容操作时会出错,通常抛出的错误为“UnicodeDecodeError”。

可以改进的地方:

  1. 加上优先级,即使被认为是头文件和库文件时因为操作者提前设好要访问该文件,所以也要统计;
  2. 把那个有点小错误的递归改掉;
  3. python应该有关于图表绘制的库,如果可以形象的显示结果就更好了;
  4. 可以访问文件时访问该文件创建的时间(Windows应该有这个功能),一同显示在最终的结果里;
  5. 对超过一定行数的代码文件做标记,比如我现在这个水平,很少写超过一千行的代码。自从用了python后就通常单个文件代码行数就更少了。