使用PYTHON统计项目代码行数
目錄
- 一 使用PYTHON統(tǒng)計項目代碼行數(shù)
- 二 應(yīng)用實例
注:原創(chuàng)不易,轉(zhuǎn)載請務(wù)必注明原作者和出處,感謝支持!
一 使用PYTHON統(tǒng)計項目代碼行數(shù)
遇到一個非常小的需求:統(tǒng)計一個項目里頭的各類源代碼共有多少行。像這種小需求,一個簡單的shell腳本就能夠完成的。但是我不會shell ヾ(。 ̄□ ̄)ツ゜゜゜。于是求助python,經(jīng)過一段時間后,寫了一個簡單的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 = 0def list_files(path):'''遍歷工程路徑path,如果遇到文件則統(tǒng)計其行數(shù),如果遇到目錄則進行遞歸'''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,計算它的行數(shù),然后根據(jù)其后綴將它的行數(shù)加到相應(yīng)的全局變量當中'''global CPP_SUFFIX_SET, PYTHON_SUFFIX_SET, JAVA_SUFFIX_SETglobal cpp_lines, python_lines, java_lines, total_lines# 統(tǒng)計行數(shù)with open(fpath, 'rb') as f:cnt = 0last_data = '\n'while True:data = f.read(0x400000)if not data:breakcnt += data.count(b'\n')last_data = dataif last_data[-1:] != b'\n':cnt += 1# 只統(tǒng)計C/C++,Python和Java這三類代碼suffix = os.path.splitext(fpath)[-1]if suffix in CPP_SUFFIX_SET:cpp_lines += cntelif suffix in PYTHON_SUFFIX_SET:python_lines += cntelif suffix in JAVA_SUFFIX_SET:java_lines += cntelse:passdef print_result():'''本函數(shù)依賴庫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_linesprint_result()簡單解釋一下代碼。首先在命令行運行該腳本并將項目目錄的路徑作為命令行參數(shù)傳入。比如,在當前目錄下面有一個目錄src,你可以使用以下命令對該項目的代碼行數(shù)進行統(tǒng)計。
python3 code_analyst.py `pwd`/src然后,將項目路徑project_path傳入list_files()當中,list_files()負責遞歸地搜索目錄下的每一個子文件或者子文件夾。如果找到的是文件,則將文件名fpath傳給count_lines()當中。count_lines()只統(tǒng)計文件后綴名在預(yù)定義的文件后綴集合當中的文件的行數(shù)。在統(tǒng)計完成之后,調(diào)用print_result()把結(jié)果打印出來。
注意:print_result()依賴軟件包prettytable,請使用下面的命令進行安裝。
sudo pip3 install prettytable二 應(yīng)用實例
src目錄的統(tǒng)計結(jié)果。
lzh@lzh-VBox:~$ python3 code_analyst.py ./Temp/src/ +-----+--------+------+-------+ | CPP | PYTHON | JAVA | TOTAL | +-----+--------+------+-------+ | 21 | 0 | 0 | 21 | +-----+--------+------+-------+ lzh@lzh-VBox:~$開源SLAM系統(tǒng)VINS-Mono的統(tǒng)計結(jié)果。
lzh@lzh-VBox:~$ python3 code_analyst.py ./VINS-Mono/ +-------+--------+------+-------+ | CPP | PYTHON | JAVA | TOTAL | +-------+--------+------+-------+ | 27695 | 0 | 0 | 27695 | +-------+--------+------+-------+ lzh@lzh-VBox:~$高翔博士《視覺SLAM十四講》配套代碼庫的統(tǒng)計結(jié)果。
lzh@lzh-VBox:~$ python3 code_analyst.py ./slambook-master/ +-------+--------+------+-------+ | CPP | PYTHON | JAVA | TOTAL | +-------+--------+------+-------+ | 14240 | 127 | 0 | 14367 | +-------+--------+------+-------+ lzh@lzh-VBox:~$上述代碼只是一段玩具代碼,非常脆弱,只能達到基本能用的程度。你輸入個錯誤的項目路徑,程序分分鐘奔潰。
轉(zhuǎn)載于:https://www.cnblogs.com/laizhenghong2012/p/11348004.html
總結(jié)
以上是生活随笔為你收集整理的使用PYTHON统计项目代码行数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用面试题(对应的知识点)
- 下一篇: websocket python爬虫_p