Python入门之用Python统计代码行
Pycharm每天都要写很多代码,如何统计每天的代码行数呢?作为一个目标十万行的coder,要想想办法!
题目:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。
首先分析一下思路捋一下大象装冰箱的步骤,从一个给定的目录统计该目录下所有的代码行大致需要以下7个步骤:
1. 遍历该目录下所有的文件。
2. 判断文件是否以“.py”结尾。(以python代码为例)
3. 打开.py文件(切忌勿用W+,W+会清空文件内容)
4. 循环读取文件的每一行
5. 判断每一行的内容:
(a) 注释: 以#开头。
(b) 注释:以三引号开头结束。
(c) 空行:除空白字符无其他。
(d) 代码行:除空白字符之后还剩下其他字符。
6. 判断是否为文件末尾,
7. 关闭文件, 返回结果.
解题思路捋清楚之后剩下的就是将各模块的代码像搭积木一样搭起来就完事了(示例代码在本文最后):
1: 导入OS,定义 code_lines_count 函数并接收一个 path 形式参数,声明了三个变量分别用于统计代码行,注释行和空行
2: 遍历os.walk获取到的file 对象,然后将文件的后缀名利用splitext函数分割然后使用列表索引 [1] 取得文件后缀名,并判断是否是以“.py”结尾。(此处也可以使用listdir, 但listdir只能取单层目录下的文件, 并且需要单独判断取得的元素是文件还是文件夹,较麻烦)
3: 定义了一个file_abs_path的变量并赋值文件的绝对路径,是因为下面的代码会多次使用,不必每次都使用so.path.join(xx,xx)。
4:对于上一个步骤获取到的以“.py”结尾的文件 利用with 方式打开(使用with可省去关闭文件的代码),对于打开的文件使用While True 循环的使用readline()去读取文件的每一行并赋值给line 变量。
5:该段代码用于对上一步骤readline()取得的行做判断是 代码行,空行还是注释行。
a:如果line为空,表示取到文件末尾,此时break while 循环,继续files 中的下一个文件操作。
b:使用strip()对readline()取得的行做去空白处理,如果经过处理后是以“#”开头则表示这行是一个注释行 此时对comm_lines 做加1 操作。
c:使用strip()对readline()取得的行做去空白处理,如果经过处理后是以三个单引号或者三个双引号开头则表示此处为一个多行注释的开始,然后判断该行的三引号数量如果为1则表示注释分多行, 否则注释为一行(一对三引号在同一行),对于注释为多行情况使用while 循环得读取接下来的行,并且没读一行对 comm_lines 做加1 操作,如果读到某一行存在三引号则判定注释结束,break 当层while循环(此处只考虑了比较规范的注释)
d:如果读到的行做过strip()之后非空且不是注释,则是一个代码行, 并对code_lines做加1操作。
e:如果上述条件都不满足,则判断为一个空行,并对space_lines 做加1操作。
6:返回统计到的代码行,注释行和空行。
7:测试代码下图是运行的一个实例
import os def code_lines_count(path): code_lines = 0 comm_lines = 0 space_lines = 0 for root,dirs,files in os.walk(path): for item in files: file_abs_path = os.path.join(root,item) postfix = os.path.splitext(file_abs_path)[1] if postfix == '.py': with open(file_abs_path) as fp: while True: line = fp.readline() if not line: break elif line.strip().startswith('#'): comm_lines += 1 elif line.strip().startswith("'''") or line.strip().startswith('"""'): comm_lines += 1 if line.count('"""') ==1 or line.count("'''") ==1: while True: line = fp.readline() comm_lines += 1 if ("'''" in line) or ('"""' in line): break elif line.strip(): code_lines += 1 else: space_lines +=1 return code_lines,comm_lines,space_lines if __name__ == '__main__': abs_dir = os.getcwd() x,y,z = code_lines_count(abs_dir) print(x,y,z)