使用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:~$
上述代码只是一段玩具代码,非常脆弱,只能达到基本能用的程度。你输入个错误的项目路径,程序分分钟奔溃。
使用PYTHON统计项目代码行数的更多相关文章
- VS2012 利用正则统计项目代码行数
原文:VS2012 利用正则统计项目代码行数 #开头和/开头或者空行都不计入代码量, 搜索出来以后最后一行就是代码行数了:
- IDEA 怎么统计项目代码行数
引言 IDEA 统计项目代码行数,主要是使用 Statistic 插件来统计 第一步 点击 File->Settings,如下图所示: 第二步 点击 install 安装 Statistic 插 ...
- Xcode 统计项目代码行数及常用快捷键
1.统计Xcode项目代码行数 1 打开终端. 2 用ls和cd进到你项目的路径. 3 输入下面的指令: grep -r "\n" classes | wc -l (cl ...
- iOS 统计项目代码行数
最近去面试 对面的"他" 问我其中一个问题 是 "你的项目代码量是多少?" 当时的确有点蒙圈, 我可以从整个项目打包的角度考虑项目大小,我还真没想过到底我的项目 ...
- Intellij idea利用Statistic插件统计项目代码行数
1 . 插件介绍统计项目中各个文件的数量,大小,行数,平均等信息根据扩展名自定义统计详细行数信息 , 包括总行数,代码行数,代码行数占比,注释行数,注释行数占比,空白行数,空白行数占比自定义选择多个文 ...
- VS统计项目代码行数
ctrl + shift + F 输入:b*[^:b#/]+.*$ 选项图如下
- Atitit.Guibutton与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数.
Atitit.Guibutton与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数. 1. Kpi::: 代码行数(凝视行数,空白的行数), 方法数,class数 1 2. ...
- Atitit.Gui按钮与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数.
Atitit.Gui按钮与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数. 1. Kpi::: 代码行数(注释行数,空白的行数), 方法数,class数 1 2. 过滤器 ...
- Visual Studio使用正则表达式快速统计总共代码行数
原文:Visual Studio使用正则表达式快速统计总共代码行数 按CTRL+SHIFT+F,勾上支持正则表达式,然后输入搜索内容: <span style="font-family ...
随机推荐
- Oracle笔记(十) 约束
表虽然建立完成了,但是表中的数据是否合法并不能有所检查,而如果要想针对于表中的数据做一些过滤的话,则可以通过约束完成,约束的主要功能是保证表中的数据合法性,按照约束的分类,一共有五种约束:非空约束.唯 ...
- Vsftpd Nginx
Linux(CentOS-6.10)下安装Vsftpd Nginx 1:创建FTP专属的账户和密码[root@localhost ~]# useradd ftpuser[root@localhost ...
- (十三)r18 cpu id
1.cpuid内核接口 lichee/linux-4.4/drivers/soc/sunxi/sunxi-sid.c int sunxi_get_soc_chipid(u8 *chipid) int ...
- linux——命令2—删除—查看—搜索
多种查看命令: 多种搜索命令: ll命令 -rw-rw-rw - 表示文件 drw-rw-rw d 表示目录文件夹 ========================== 使用rm删除文件 例如:r ...
- Springboot静态资源映射 “/” 引发的血案
因为少写一个 / 浪费已个下午的时间,
- 域知识深入学习一:Active Directory 域服务
AD DS用来组织,管理,控制网络资源 1.1 Active Directory 域服务概述 AD内的directorydatabase(目录数据库)用来存储用户账户,计算机账户,打印机与共享文件 ...
- gitlab常用的命令
git checkout . #本地所有修改的.没有的提交的,都返回到原来的状态git stash #把所有没有提交的修改暂存到stash里面.可用git stash pop回复.git reset ...
- 阿里云ACP系列(复习笔记,题库,视频)
本人通过阿里云ACP认证总结的复习笔记,搜集的视频以及练习题库,助力大家顺利通过阿里云云计算工程师ACP,考试交流可加群:58284982 阿里云认证ACP-ECS (试题占比:31%) 阿里云认证A ...
- vue 后退不刷新,前进刷新 keep-alive
最近在开发中遇到了这样的一个问题: A.B.C三个页面,有如下这样的场景: (1)从页面A离开进入B或C的时候,缓存A页面的数据,并且返回到A后,能保持A页面的跳转前职位 (2)离开B进入C的时候,缓 ...
- BZOJ 1022 / P4279 Luogu [SHOI2008]小约翰的游戏 (反Nim游戏) (Anti-SG)
题意 反Nim游戏,两人轮流选一堆石子拿,拿到最后一个的输.问先手是否必胜. 分析 怎么说,分类讨论? 情形1:首先考虑最简单的情况,所有石子数都为1.那么奇数堆石子为必败,偶数为必胜 情形2:然后考 ...