python计算营业额代码_使用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:~$

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值