原文见:
使用python写的代码行数统计程序
因为最近在作的项目很特殊,所使用的语言是一个公司内部的IDE环境,而这个IDE所产生的代码并不是以文本方式存放的,都是放在二进制文件中,而且由于 这门语言外界几乎接触不到,所以没有针对它的代码统计程序,当一个模块完成后要统计代码行数会很困难,要统计的话必须先把代码编辑器中的内容拷贝到一个文 本类型的文件中。
正好一直在关注python,还没有用python写过程序,今天就利用中午休息的时间写了一个简单的代码统计程序。
对输入的路径作递归,查找代码文件,对每一个代码文件计算它的注释行数,空行数,真正的代码行数。
自己用的程序,就写的粗糙了,也没加异常处理。
主要的python脚本文件LineCount.py的内容如下:
可以看到extension == '.txt' or extension == '.hol'这句是判断文件的后缀,来确定是否要计算代码行数。
if eachLine.find('--') == 0 :这句来判断当前行是不是单行注释(我们的这门语言不支持块注释)。
为了能在其他机器上运行,使用了py2exe来把python脚本生成可执行的exe,setup.py脚本内容如下:
不过生成exe后程序臃肿很多,有3M多。
感觉使用python确实是件很惬意的事。
因为最近在作的项目很特殊,所使用的语言是一个公司内部的IDE环境,而这个IDE所产生的代码并不是以文本方式存放的,都是放在二进制文件中,而且由于 这门语言外界几乎接触不到,所以没有针对它的代码统计程序,当一个模块完成后要统计代码行数会很困难,要统计的话必须先把代码编辑器中的内容拷贝到一个文 本类型的文件中。
正好一直在关注python,还没有用python写过程序,今天就利用中午休息的时间写了一个简单的代码统计程序。
对输入的路径作递归,查找代码文件,对每一个代码文件计算它的注释行数,空行数,真正的代码行数。
自己用的程序,就写的粗糙了,也没加异常处理。
主要的python脚本文件LineCount.py的内容如下:
import
sys;
import os;
class LineCount:
def trim(self,docstring):
if not docstring:
return ''
lines = docstring.expandtabs().splitlines()
indent = sys.maxint
for line in lines[ 1 :]:
stripped = line.lstrip()
if stripped:
indent = min(indent, len(line) - len(stripped))
trimmed = [lines[0].strip()]
if indent < sys.maxint:
for line in lines[ 1 :]:
trimmed.append(line[indent:].rstrip())
while trimmed and not trimmed[ - 1 ]:
trimmed.pop()
while trimmed and not trimmed[0]:
trimmed.pop(0)
return ' /n ' .join(trimmed)
def FileLineCount(self,filename):
(filepath,tempfilename) = os.path.split(filename);
(shotname,extension) = os.path.splitext(tempfilename);
if extension == ' .txt ' or extension == ' .hol ' : # file type
file = open(filename, ' r ' );
self.sourceFileCount += 1 ;
allLines = file.readlines();
file.close();
lineCount = 0;
commentCount = 0;
blankCount = 0;
codeCount = 0;
for eachLine in allLines:
if eachLine != " " :
eachLine = eachLine.replace( " " , "" ); # remove space
eachLine = self.trim(eachLine); # remove tabIndent
if eachLine.find( ' -- ' ) == 0 : # LINECOMMENT
commentCount += 1 ;
else :
if eachLine == "" :
blankCount += 1 ;
else :
codeCount += 1 ;
lineCount = lineCount + 1 ;
self.all += lineCount;
self.allComment += commentCount;
self.allBlank += blankCount;
self.allSource += codeCount;
print filename;
print ' Total : ' ,lineCount ;
print ' Comment : ' ,commentCount;
print ' Blank : ' ,blankCount;
print ' Source : ' ,codeCount;
def CalulateCodeCount(self,filename):
if os.path.isdir(filename) :
if not filename.endswith( ' // ' ):
filename += ' // ' ;
for file in os.listdir(filename):
if os.path.isdir(filename + file):
self.CalulateCodeCount(filename + file);
else :
self.FileLineCount(filename + file);
else :
self.FileLineCount(self,filename);
# Open File
def __init__ (self):
self.all = 0;
self.allComment = 0;
self.allBlank = 0;
self.allSource = 0;
self.sourceFileCount = 0;
filename = raw_input( ' Enter file name: ' );
self.CalulateCodeCount(filename);
if self.sourceFileCount == 0 :
print ' No Code File ' ;
pass ;
print ' /n ' ;
print ' ***************** All Files ********************** ' ;
print ' Files : ' ,self.sourceFileCount;
print ' Total : ' ,self.all;
print ' Comment : ' ,self.allComment;
print ' Blank : ' ,self.allBlank;
print ' Source : ' ,self.allSource;
print ' **************************************************** ' ;
myLineCount = LineCount();
import os;
class LineCount:
def trim(self,docstring):
if not docstring:
return ''
lines = docstring.expandtabs().splitlines()
indent = sys.maxint
for line in lines[ 1 :]:
stripped = line.lstrip()
if stripped:
indent = min(indent, len(line) - len(stripped))
trimmed = [lines[0].strip()]
if indent < sys.maxint:
for line in lines[ 1 :]:
trimmed.append(line[indent:].rstrip())
while trimmed and not trimmed[ - 1 ]:
trimmed.pop()
while trimmed and not trimmed[0]:
trimmed.pop(0)
return ' /n ' .join(trimmed)
def FileLineCount(self,filename):
(filepath,tempfilename) = os.path.split(filename);
(shotname,extension) = os.path.splitext(tempfilename);
if extension == ' .txt ' or extension == ' .hol ' : # file type
file = open(filename, ' r ' );
self.sourceFileCount += 1 ;
allLines = file.readlines();
file.close();
lineCount = 0;
commentCount = 0;
blankCount = 0;
codeCount = 0;
for eachLine in allLines:
if eachLine != " " :
eachLine = eachLine.replace( " " , "" ); # remove space
eachLine = self.trim(eachLine); # remove tabIndent
if eachLine.find( ' -- ' ) == 0 : # LINECOMMENT
commentCount += 1 ;
else :
if eachLine == "" :
blankCount += 1 ;
else :
codeCount += 1 ;
lineCount = lineCount + 1 ;
self.all += lineCount;
self.allComment += commentCount;
self.allBlank += blankCount;
self.allSource += codeCount;
print filename;
print ' Total : ' ,lineCount ;
print ' Comment : ' ,commentCount;
print ' Blank : ' ,blankCount;
print ' Source : ' ,codeCount;
def CalulateCodeCount(self,filename):
if os.path.isdir(filename) :
if not filename.endswith( ' // ' ):
filename += ' // ' ;
for file in os.listdir(filename):
if os.path.isdir(filename + file):
self.CalulateCodeCount(filename + file);
else :
self.FileLineCount(filename + file);
else :
self.FileLineCount(self,filename);
# Open File
def __init__ (self):
self.all = 0;
self.allComment = 0;
self.allBlank = 0;
self.allSource = 0;
self.sourceFileCount = 0;
filename = raw_input( ' Enter file name: ' );
self.CalulateCodeCount(filename);
if self.sourceFileCount == 0 :
print ' No Code File ' ;
pass ;
print ' /n ' ;
print ' ***************** All Files ********************** ' ;
print ' Files : ' ,self.sourceFileCount;
print ' Total : ' ,self.all;
print ' Comment : ' ,self.allComment;
print ' Blank : ' ,self.allBlank;
print ' Source : ' ,self.allSource;
print ' **************************************************** ' ;
myLineCount = LineCount();
可以看到extension == '.txt' or extension == '.hol'这句是判断文件的后缀,来确定是否要计算代码行数。
if eachLine.find('--') == 0 :这句来判断当前行是不是单行注释(我们的这门语言不支持块注释)。
为了能在其他机器上运行,使用了py2exe来把python脚本生成可执行的exe,setup.py脚本内容如下:
from
distutils.core
import
setup
import py2exe
setup(
version = " 0.0.1 " ,
description = " LineCount " ,
name = " LineCount " ,
console = [ " LineCount.py " ],
)
import py2exe
setup(
version = " 0.0.1 " ,
description = " LineCount " ,
name = " LineCount " ,
console = [ " LineCount.py " ],
)
不过生成exe后程序臃肿很多,有3M多。
感觉使用python确实是件很惬意的事。