科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件 使用python写的代码行数统计程序

使用python写的代码行数统计程序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

因为最近在作的项目很特殊,所使用的语言是一个公司内部的IDE环境,而这个IDE所产生的代码并不是以文本方式存放的,都是放在二进制文件中,而且由于 这门语言外界几乎接触不到,所以没有针对它的代码统计程序,当一个模块完成后要统计代码行数会很困难,要统计的话必须先把代码编辑器中的内容拷贝到一个文 本类型的文件中。

作者:dahuzizyd 来源:CSDN 2008年5月18日

关键字: 行数 代码 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();

可以看到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确实是件很惬意的事。
相关文章
对该文的评论
CSDN 网友 ( 2006-04-19)
可以使用下面的方式计算代码量,python+shell,包括两个文件:
/* pjm.py*/
def FileWalker(root, patterns='*', single_level=False, yield_folders=False):
    import os, fnmatch
    # Expand patterns from semicolon-separated string to list
    patterns = patterns.split(';')
    for path, subdirs, files in os.walk(root):
        if yield_folders:
            files.extend(subdirs)
        files.sort( )
        for name in files:
            for pattern in patterns:
                if fnmatch.fnmatch(name, pattern):
                    yield pattern, os.path.join(path, name)
                    break
        if single_level:
            break

def info(object, spacing=10, collapse=1):
    """Print methods and doc strings.
    Takes module, class, list, dictionary, or string."""

    print str(object.__doc__)
    methodList = [method for method in dir(object) if callable(getattr(object, method))]

    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                     (method.ljust(spacing),
                      processFunc(str(getattr(object, method).__doc__)))
                     for method in methodList])

def CreateIISWebFolder( phyPath, virtualPath ):
    import win32com.client
    print phyPath
    vRoot = win32com.client.GetObject("IIS://localhost/W3svc/1/Root")
    for x in vRoot:
        if x.Name == virtualPath:
            vRoot.Delete("IIsWebVirtualDir",virtualPath)
            break
    
    vDir = vRoot.Create("IIsWebVirtualDir", virtualPath)
    vDir.AccessRead = True
    vDir.Path = phyPath
    vDir.DirBrowseFlags = 1073741886 #HEX 4000003E
    vDir.EnableDirBrowsing = True
    vDir.AppCreate( True )
    vDir.AccessScript = True
    vDir.SetInfo()
    
class ProjectManagement:
    """the Project Helper, Goal to help developers to maintain project easily"""
    def scale( self, argv, spacing=10 ):
        """Caclulate the Scale of the Project"""
        import os
        
        dictionary = os.path.abspath( argv[0].strip('\'') )
        patterns = argv[1].strip('\'')
    
        print 'The Project Location:\n\t', dictionary, '\n', 'The File Patterns:\n\t', patterns,'\n'
        print 'Searching......\n'
        #init data structure.
        filedict={}
        linedict={}
        for pattern in patterns.split(';'):
            filedict[pattern]=0
            linedict[pattern]=0
         
        #start to stat.
        for pattern, file in FileWalker(dictionary,patterns):
            filedict[pattern] += 1
            linedict[pattern] += len(open(file, 'rU').readlines( ))
    
        print 'The Detail of The Project:'
        print '\n'.join([ "%s: %s lines %s files" %
                          (pattern.ljust(8),
                           str(linedict[pattern]).rjust(spacing),
                           str(filedict[pattern]).rjust(spacing))
                          for pattern in patterns.split(';') if filedict[pattern]!=0 ])
    
        print '\nThe Scale of The Project:\n', str(sum( linedict.values() )).rjust(20), 'lines',str(sum( filedict.values() )).rjust(10), 'files'

    def release( self, argv ):
        import os, shutil, fnmatch
        """Get the release version of the Project"""
        srroot = os.path.abspath( argv[0].strip('\'') )
        tgroot = argv[1].strip('\'')
        excludepatterns = len(argv)==3 and argv[2].strip('\'') or ""

        newpath_func = lambda x : x.replace( os.path.split(srroot)[0],tgroot )

        #delete the target dir
        if os.path.exists( newpath_func(srroot) )==True:
            shutil.rmtree( newpath_func(srroot) )
        #copy
        for path, subdirs, files in os.walk(srroot):
            for subdir in subdirs:
                #print os.path.join( newpath_func(path), subdir )
                os.makedirs( os.path.join( newpath_func(path), subdir ) )
            for file in files:
                b = False
                for pattern in excludepatterns.split(';'):
                    if fnmatch.fnmatch(file, pattern)==True:
                        b = True
                        break
                b==False and shutil.copy( os.path.join( path, file ), newpath_func(path) )

    def releasetime( self, argv ):
        import os, datetime
        argv[1] = argv[1].strip('\'')
        #print argv
        argv[1] = os.path.join(argv[1], str( datetime.date.today() ) )
        #print argv[1]
        self.release( argv )
        
    def clearvss( self, argv ):
        """Clear VSS Files and Features in the Project"""
        import win32con, win32api, os
        dictionary = argv[0]
        clearpatterns = len(argv)==2 and argv[1].strip('\'') or "*.vssscc;*.scc;*.vspscc"
        
        for pattern, file in FileWalker(dictionary):
            win32api.SetFileAttributes(file, win32con.FILE_ATTRIBUTE_NORMAL)
        for pattern, file in FileWalker(dictionary,clearpatterns):
            os.remove(file);
        
#---- mainline

def main(argv):
    manager = ProjectManagement()
    if argv[1] in [ "-%s" % (x) for x in dir(ProjectManagement) if callable(getattr(manager,x)) ]:
        methodobj = getattr(manager, argv[1][1:])
        methodobj(argv[2:])
    else:
        print "\nOperator Argument Error: %s\n" % argv[1]
        info(manager)

if __name__ == '__main__':
    import sys
    retval = main(sys.argv)
    sys.exit(retval)
/*scale.bat*/
python D:\daVinic\Python\pjm.py -scale .\ *.cs;*.aspx;*.ascx;*.xml;*.config
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章