主要的python脚本文件LineCount.py的内容如下:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
import sys;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
import os;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
class LineCount:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
   
def trim(self,docstring):ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
if not docstring:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
return ''ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        lines
= docstring.expandtabs().splitlines()ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        indent
= sys.maxintŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
for line in lines[1:]:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            stripped
= line.lstrip()ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
if stripped:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                indent
= min(indent, len(line) - len(stripped))ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        trimmed
= [lines[0].strip()]ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
if indent < sys.maxint:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
for line in lines[1:]:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                trimmed.append(line[indent:].rstrip())ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
while trimmed and not trimmed[-1]:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            trimmed.pop()ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
while trimmed and not trimmed[0]:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            trimmed.pop(0)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
return '\n'.join(trimmed)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
   
def FileLineCount(self,filename):ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        (filepath,tempfilename)
= os.path.split(filename);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        (shotname,extension)
= os.path.splitext(tempfilename);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
if extension == '.txt' or extension == '.hol' : # file type ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            file = open(filename,'r');ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            self.sourceFileCount
+= 1;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            allLines
= file.readlines();ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            file.close();ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            lineCount   
=0;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            commentCount
= 0;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            blankCount 
= 0;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            codeCount   
= 0;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
for eachLine in allLines:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
               
if eachLine != " " :ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    eachLine
= eachLine.replace(" ",""); #remove spaceŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    eachLine = self.trim(eachLine);      #remove tabIndentŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                   
if  eachLine.find('--') == 0 :  #LINECOMMENT ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                        commentCount += 1;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                   
else :ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                       
if eachLine == "":ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                            blankCount
+= 1;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                       
else :ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                            codeCount
+= 1;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                lineCount
= lineCount + 1;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            self.all
+= lineCount;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            self.allComment
+= commentCount;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            self.allBlank
+= blankCount;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            self.allSource
+= codeCount;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
print filename;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
print '          Total      :',lineCount ;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
print '          Comment    :',commentCount;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
print '          Blank      :',blankCount;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
print '          Source    :',codeCount;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
   
def CalulateCodeCount(self,filename):ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
if os.path.isdir(filename) :ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
if not filename.endswith('\\'):ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                filename
+= '\\'; ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
for file in os.listdir(filename):ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
               
if os.path.isdir(filename + file):ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    self.CalulateCodeCount(filename
+ file);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
               
else:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    self.FileLineCount(filename
+ file);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
else:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            self.FileLineCount(filename);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
   
# Open FileŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
def __init__(self):ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        self.all
= 0;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        self.allComment
=0;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        self.allBlank
= 0;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        self.allSource
= 0;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        self.sourceFileCount
= 0;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        filename
= raw_input('Enter file name: ');ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        self.CalulateCodeCount(filename);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
if self.sourceFileCount == 0 :ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
print 'No Code File';ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
           
pass;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
print '\n';ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
print '*****************  All Files  **********************';ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
print '    Files      :',self.sourceFileCount;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
print '    Total      :',self.all;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
print '    Comment    :',self.allComment;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
print '    Blank      :',self.allBlank;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
print '    Source    :',self.allSource;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
       
print '****************************************************';ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
myLineCount
= LineCount();
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
可以看到extension == '.txt' or extension == '.hol'这句是判断文件的后缀,来确定是否要计算代码行数。ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
if  eachLine.find('--') == 0 :这句来判断当前行是不是单行注释(我们的这门语言不支持块注释)。ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
为了能在其他机器上运行,使用了py2exe来把python脚本生成可执行的exe,setup.py脚本内容如下:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
from distutils.core import setupŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
import py2exeŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
setup(ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
  ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    version
= "0.0.1",ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    description
= "LineCount",ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    name
= "LineCount",ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    console
= ["LineCount.py"],ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    )ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
不过生成exe后程序臃肿很多,有3M多。ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
感觉使用python确实是件很惬意的事。ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š