(转)python 计算代码行数以及相关知识点

看了这段代码,暂时trim函数还是没有弄懂,加了一些知识点扩展。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os

class LineCount:
  def trim(self,docstring):
    if not docstring:
      return ''
    lines = docstring.expandtabs().splitlines()
    ''' expandtabs:将tab替换成对应的tabsize数量空格 splitlines():按照\n来分割行 http://www.runoob.com/python/att-string-splitlines.html '''

    indent = sys.maxint
    for line in lines[1:]:
      '''Return a copy of the string with the leading and trailing characters removed. The chars argument is a string specifying the set of characters to be removed. If omitted(省略) or None, the chars argument defaults to removing whitespace. '''
      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())

    ''' Python中的strip用于去除字符串的首尾字符,同理,lstrip用于去除左边的字符,rstrip用于去除右边的字符。 这三个函数都可传入一个参数,指定要去除的首尾字符。 需要注意的是,传入的是一个字符数组,编译器去除两端所有相应的字符,直到没有匹配的字符,比如: theString = 'saaaay yes no yaaaass' print theString.strip('say') theString依次被去除首尾在['s','a','y']数组内的字符,直到字符在不数组内。所以,输出的结果为: yes no 比较简单吧,lstrip和rstrip原理是一样的。 注意:当没有传入参数时,是默认去除首尾空格的。 theString = 'saaaay yes no yaaaass' print theString.strip('say') print theString.strip('say ') #say后面有空格 print theString.lstrip('say') print theString.rstrip('say') 运行结果: yes no es no yes no yaaaass saaaay yes no '''

    while trimmed and not trimmed[-1]:
      trimmed.pop()
    while trimmed and not trimmed[0]:
      trimmed.pop(0)
      ''' >>> a=[1,2,3] >>> a.remove(2) >>> a [1, 3] >>> a=[1,2,3] >>> del a[1] >>> a [1, 3] >>> a= [1,2,3] >>> a.pop(1) 2 >>> a [1, 3] >>> 那么Python对于列表的del, remove, pop操作,它们之间有何区别呢? 首先,remove 是删除首个符合条件的元素。并不是删除特定的索引。如下例: 本文来自Novell迷网站 http://novell.me >>> a = [0, 2, 2, 3] >>> a.remove(2) >>> a [0, 2, 3] 而对于 del 来说,它是根据索引(元素所在位置)来删除的,如下例: >>> a = [3, 2, 2, 1] >>> del a[1] [3, 2, 1] 第1个元素为a[0] --是以0开始计数的。则a[1]是指第2个元素,即里面的值2. 最后我们再看看pop >>> a = [4, 3, 5] >>> a.pop(1) 3 >>> a [4, 5] pop返回的是你弹出的那个数值。 所以使用时要根据你的具体需求选用合适的方法。 内容来自http://novell.me 另外它们如果出错,出错模式也是不一样的。注意看下面区别: >>> a = [4, 5, 6] >>> a.remove(7) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: list.remove(x): x not in list >>> del a[7] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list assignment index out of range >>> a.pop(7) Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: pop index out of range '''

    return '\n'.join(trimmed) 
    '''join是联合函数,将()内按指定字符连接。括号内必须是一个对象。如果有多个就编程元组,或是列表。 >>> ",".join(('a','b','c')) 'a,b,c' 如果不用元组,会按每个字符分开,a,b内部也会被分开: >>> k1="ttt" >>> k2="sss" >>> a=k1+k2 >>> ",".join(a) 't,t,t,s,s,s' '''

  def FileLineCount(self,filename):
    (filepath,tempfilename) = os.path.split(filename); #分离目录和文件名
    (shotname,extension) = os.path.splitext(tempfilename); #分离文件名和扩展名(文件类型)
    if extension == '.txt' or extension == '.py': 
      file = open(filename,'r');
      self.sourceFileCount += 1;
      '''获取文本行 ReadLines 和 ReadAllLines 方法不同点在于:当使用 ReadLines 时, 您可以在返回整个集合之前开始枚举字符串集合;当您使用 ReadAllLines 时,则必须 等待整个字符串数组都被返回后才能访问数组。 因此,在处理非常大的文件时, ReadLines 可能更高效。 我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。 文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。每种方法可以接受一个变量以限制每次 读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。 然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于 可用内存,则不可能实现这种处理。 .readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件 内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。 '''
      allLines = file.readlines(); 
      file.close();

      lineCount    = 0;
      commentCount = 0;
      blankCount   = 0;
      codeCount    = 0;
      for eachLine in allLines:
        if eachLine != " ":
          eachLine = eachLine.replace(" ","");
# print eachLine;
          eachLine = self.trim(eachLine);
# print eachLine;
          if eachLine.find('#') == 0:
            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 '*************** All Files **************';

myLinecount = LineCount();

你可能感兴趣的:(python)