第 0007 题: 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。
Answer:
-
先遍历目录,获取所有以.py为后缀的程序,然后再对单个文件执行分析计数,将单个文件的计数结果相加
这里声明下,我对代码行的理解是除掉空行和注释的有效行数
python程序的本质上是一个txt文件,按读取txt文件操作执行就可得到整个代码
这里采取的是readlines()方式,但是用readline()应该能得到更好的效果,这点后文会提
-
关于遍历目录的方法以及判断后缀的方法在上面几章习题中已经提过了
def getfile(path):
list=os.listdir(path)
filelist=[]
for i in list:
if os.path.splitext(i)[1]=='.py':
filelist.append(i)
return filelist
这个函数的目的就是返回一个以.py为后缀的列表
-
Attention:
readlines()返回的是一个列表,则我们要做的就是遍历列表来判断每行属于什么
首先,一个程序的代码是有缩进的,我们先需要用strip()去掉字符串开头的空白字符
用startswith()判断是以什么开头
空字符串和以“#”开头的注释都比较好判断,重点在于三引号这种形式的注释""" or '''
先判断是不是以三引号开头,如果是,说明这行开始是注释
我们的目标是取到后面与之匹配的三引号,所以目的是从这行开始往后寻找三引号
需要一个i确定这行在列表中的位置,从i位置开始遍历,找到三引号
但是在确定i位置时候,发现一个有趣的现象,不知道有没有大佬能解答
但是在确定代码行数中会发现一个问题
如果你要确定代码行数,你应该要跳过这块注释代码
因为三引号注释当中的代码不以三引号开头也不以之结尾,但是却是注释
然而在大循环之中,你无法以一个平级的else来判断
我能想到比较好的实现就是
1.递归思想,在找到三引号之后递归调用,从下一行循环
2."代码行的理解是除掉空行和注释的有效行数",那么用总行数减去空白与注释,就是代码行
-
代码实现
#coding:utf-8
import os
import re
from collections import defaultdict
os.chdir(r'C:\Users\Alex.hasee-PC\Desktop\pythonprogram\0007')
def getfile(path):
list=os.listdir(path)
filelist=[]
for i in list:
if os.path.splitext(i)[1]=='.py':
filelist.append(i)
return filelist
def count(filename):
totalline,blankline,comment=0,0,0
py=open(filename)
lines=py.readlines()
for line in lines:
totalline+=1
fline=line.strip()
if not fline:
blankline+=1
elif fline.startswith('#'):
comment+=1
elif fline.startswith("'''") or fline.startswith('"""'):
comment+=1
i=lines.index(line)
for k in range(i+1,len(lines)):
comment+=1
if '"""' in lines[k] or "'''" in lines[k]:
break
codeline=totalline-blankline-comment
print ("name:%s : codeline:%d,blankline:%d,comment:%d") %(filename,codeline,blankline,comment)
return codeline,blankline,comment
code,blank,comments=0,0,0
f=getfile(r'C:\Users\Alex.hasee-PC\Desktop\pythonprogram\0007')
for i in f:
c=count(i)
code+=c[0]
blank+=c[1]
comments+=c[2]
print "codeline:",code
print "blankline:",blank
print "comments:",comments
-