zoukankan      html  css  js  c++  java
  • 使用PYTHON统计项目代码行数


    注:原创不易,转载请务必注明原作者和出处,感谢支持!

    一 使用PYTHON统计项目代码行数

    遇到一个非常小的需求:统计一个项目里头的各类源代码共有多少行。像这种小需求,一个简单的shell脚本就能够完成的。但是我不会shell ヾ(。 ̄□ ̄)ツ゜゜゜。于是求助python,经过一段时间后,写了一个简单的Python脚本如下。

    # code_analyst.py
    
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import os
    import sys
    import prettytable as pt
    
    # 后缀集合
    CPP_SUFFIX_SET = {'.h', '.hpp', '.hxx', '.c', '.cpp', '.cc', '.cxx'}
    PYTHON_SUFFIX_SET = {'.py'}
    JAVA_SUFFIX_SET = {'.java'}
    
    # 全局变量
    cpp_lines = 0
    python_lines = 0
    java_lines = 0
    total_lines = 0
    
    
    def list_files(path):
        '''
        遍历工程路径path,如果遇到文件则统计其行数,如果遇到目录则进行递归
        '''
        filenames = os.listdir(path)
        for f in filenames:
            fpath = os.path.join(path, f)
            if (os.path.isfile(fpath)):
                count_lines(fpath)
            if (os.path.isdir(fpath)):
                list_files(fpath)
    
    
    def count_lines(fpath):
        '''
        对于文件fpath,计算它的行数,然后根据其后缀将它的行数加到相应的全局变量当中
        '''
        global CPP_SUFFIX_SET, PYTHON_SUFFIX_SET, JAVA_SUFFIX_SET
        global cpp_lines, python_lines, java_lines, total_lines
    
        # 统计行数
        with open(fpath, 'rb') as f:
            cnt = 0
            last_data = '
    '
            while True:
                data = f.read(0x400000)
                if not data:
                    break
                cnt += data.count(b'
    ')
                last_data = data
            if last_data[-1:] != b'
    ':
                cnt += 1
    
        # 只统计C/C++,Python和Java这三类代码
        suffix = os.path.splitext(fpath)[-1]
        if suffix in CPP_SUFFIX_SET:
            cpp_lines += cnt
        elif suffix in PYTHON_SUFFIX_SET:
            python_lines += cnt
        elif suffix in JAVA_SUFFIX_SET:
            java_lines += cnt
        else:
            pass
    
    
    def print_result():
        '''
        本函数依赖库prettytable,请使用sudo pip3 install prettytable进行安装
        '''
        tb = pt.PrettyTable()
        tb.field_names = ['CPP', 'PYTHON', 'JAVA', 'TOTAL']
        tb.add_row([cpp_lines, python_lines, java_lines, total_lines])
        print(tb)
    
    
    if __name__ == '__main__':
        if (len(sys.argv) != 2):
            print("Usage : python3 code_analyst.py project_path")
        else:
            project_path = sys.argv[1]
            list_files(project_path)
    
            total_lines = cpp_lines + python_lines + java_lines
            print_result()
    
    

    简单解释一下代码。首先在命令行运行该脚本并将项目目录的路径作为命令行参数传入。比如,在当前目录下面有一个目录src,你可以使用以下命令对该项目的代码行数进行统计。

    python3 code_analyst.py `pwd`/src
    

    然后,将项目路径project_path传入list_files()当中,list_files()负责递归地搜索目录下的每一个子文件或者子文件夹。如果找到的是文件,则将文件名fpath传给count_lines()当中。count_lines()只统计文件后缀名在预定义的文件后缀集合当中的文件的行数。在统计完成之后,调用print_result()把结果打印出来。

    注意:print_result()依赖软件包prettytable,请使用下面的命令进行安装。

    sudo pip3 install prettytable
    

    二 应用实例

    src目录的统计结果。

    lzh@lzh-VBox:~$ python3 code_analyst.py ./Temp/src/
    +-----+--------+------+-------+
    | CPP | PYTHON | JAVA | TOTAL |
    +-----+--------+------+-------+
    |  21 |   0    |  0   |   21  |
    +-----+--------+------+-------+
    lzh@lzh-VBox:~$
    

    开源SLAM系统VINS-Mono的统计结果。

    lzh@lzh-VBox:~$ python3 code_analyst.py ./VINS-Mono/
    +-------+--------+------+-------+
    |  CPP  | PYTHON | JAVA | TOTAL |
    +-------+--------+------+-------+
    | 27695 |   0    |  0   | 27695 |
    +-------+--------+------+-------+
    lzh@lzh-VBox:~$
    

    高翔博士《视觉SLAM十四讲》配套代码库的统计结果。

    lzh@lzh-VBox:~$ python3 code_analyst.py ./slambook-master/
    +-------+--------+------+-------+
    |  CPP  | PYTHON | JAVA | TOTAL |
    +-------+--------+------+-------+
    | 14240 |  127   |  0   | 14367 |
    +-------+--------+------+-------+
    lzh@lzh-VBox:~$
    

    上述代码只是一段玩具代码,非常脆弱,只能达到基本能用的程度。你输入个错误的项目路径,程序分分钟奔溃。

  • 相关阅读:
    Java读写文本文件操作
    java常用的文件读写操作
    CentOS yum 源的配置与使用
    每天一个linux命令目录
    Linux的概念与体系
    linux ACL权限规划:getfacl,setfacl使用
    基于大数据的电影网站项目开发之HBase分布式安装(四)
    基于大数据的电影网站项目开发之阶段性总结(三)
    基于大数据的电影网站项目开发之Hadoop2.6.0伪分布式设置(二)
    基于大数据的电影网站项目开发之CentOS的安装(一)
  • 原文地址:https://www.cnblogs.com/laizhenghong2012/p/11348004.html
Copyright © 2011-2022 走看看