使用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 = '\n'
        while True:
            data = f.read(0x400000)
            if not data:
                break
            cnt += data.count(b'\n')
            last_data = data
        if last_data[-1:] != b'\n':
            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:~$

上述代碼只是一段玩具代碼,非常脆弱,只能達到基本能用的程度。你輸入個錯誤的項目路徑,程序分分鍾奔潰。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM