因為最近在作的項目很特殊,所使用的語言是一個公司內部的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(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"],
)
不過產生exe後程式臃腫很多,有3M多。
感覺使用python確實是件很愜意的事。