看了这段代码,暂时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();