前些日子做了个小项目,特别想知道自己编了多少的代码量,我就想弄个小程序统计一下代码行,想起曾经统计代码行用的方法是全部导入到Eclipse项目中,然后用正则表达式匹配。eclipse -> search -> file -> 勾选regular expression后,使用的正则表达式如下:
所有行
\n 或者 .*\n
除去空白行
^.*\S.*$
But~~~我现在重装系统了,没有eclipse了,做的项目也无法导入eclipse的,于是,我呼唤更通用的办法。就是编写一个小程序,而统计代码行涉及的工作确实很多,包括:
用C或者C++都比较麻烦,于是我就各种学习,查资料,弄了小菜鸟的第一个python程序。安装步骤省略(各种下一步),然后配置环境变量中的Path值,加入安装Python的根目录,比如:C:\Python32。在cmd中输入python出现版本号信息,则证明安装成功了。
(以下基于Python版本3.2.3)
首先,离不开一个os.walk函数的帮忙,分析一下os.walk函数的用法
假设文件夹结构如图:
import os
if(__name__=='__main__'):
for root,dirs,files in os.walk('A'):
print (root, dirs, files)
结果为:
E:\technology\python\code>python listfile.py
A ['B', 'D'] []
A\B ['C'] []
A\B\C [] []
A\D [] []
可以看出,这个函数就可以实现文件目录树的递归遍历了。
怎么实现文件目录树的有选择的遍历呢?
红叉的文件表示不需要遍历的文件
运行下面代码可以列出所有文件名:
import os
if(__name__=='__main__'):
for root,dirs,files in os.walk('A'):
for afile in files:
print (root + os.sep + afile)
结果:
E:\technology\python\code>python listfile.py
A\B\img.png =〉无需统计
A\B\test.py =〉需统计
A\B\txt.txt =〉无需统计
A\E\test.py =〉无需统计
下面使用split函数和in操作符来实现文件名的筛选
import os
if(__name__=='__main__'):
for root,dirs,files in os.walk('A'):
if(root in ['A'+os.sep+'E']):
continue
for afile in files:
ext=afile.split('.')
ext=ext[-1]
if(ext in ['py']):
print (root+os.sep+afile)
打印结果正是我们需要的:
E:\technology\python\code>python listfile.py
A\B\test.py
空行的判断可以借助一个拆分字符串的函数split。空行.split()会返回False。如下:
>>> (bool)("".split())
False
>>> (bool)("d".split())
True
>>> (bool)(" ".split())
False
因此判断一个文件行数的函数可以定义如下:
def afileline(f_path):
res=0
f=open(f_path)
for lines in f:
if(lines.split()):
res+=1
return res
好啦,基本上基础的东西都已经差不多了。首先,修改递归遍历的文件,使其不包含PHPExcel库,adodb5库,以及jquery, jquery等脚本,如下:
import os
if(__name__=='__main__'):
host='C:'+os.sep+'wamp'+os.sep+'www'+os.sep+'mydms'
for root,dirs,files in os.walk(host):
if(root.startswith(host+os.sep+'adodb5')):
continue
if(root.startswith(host+os.sep+'core\PHPExcel')):
continue
if(root.startswith(host+os.sep+'ext\editor')):
continue
for afile in files:
if(afile in ['PHPExcel.php', 'jquery-1.5.2.js', 'jquery-ui.js','jquery-ui.css','timer.js']):
continue
ext=afile.split('.')
ext=ext[-1]
if(ext in ['php','css','js','html']):
print (root+os.sep+afile)
把输出重定向到文件,
E:\technology\python\code>python listfile.py > allfiles.txt
看一看,基本上剩下的文件都是我自己写的了。
最后,把两部分代码融合起来就可以统计总的代码行以及不含空行的代码行和统计代码文件个数啦。
import sys,os
def afileline(f_path):
res=0
f=open(f_path,"r",1,"utf8")
for lines in f:
if(lines.split()):
res+=1
return res
if(__name__=='__main__'):
host='C:'+os.sep+'wamp'+os.sep+'www'+os.sep+'mydms'
allline=0
allfiles=0
for root,dirs,files in os.walk(host):
if(root.startswith(host+os.sep+'adodb5')):
continue
if(root.startswith(host+os.sep+'core\PHPExcel')):
continue
if(root.startswith(host+os.sep+'ext\editor')):
continue
for afile in files:
if(afile in ['PHPExcel.php', 'jquery-1.5.2.js', 'jquery-ui.js','jquery-ui.css','timer.js']):
continue
ext=afile.split('.')
ext=ext[-1]
if(ext in ['php','css','js','html']):
itpath=root+os.sep+afile
allfiles+=1
allline+=afileline(itpath)
print ('Total lines:',allline)
print ('Total: ',allfiles)
呵呵,终于知道了,我做的小项目有1万4千行代码(除去空行),呵呵。