博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用python统计代码行
阅读量:5151 次
发布时间:2019-06-13

本文共 3472 字,大约阅读时间需要 11 分钟。

  

  参加光荣之路测试开发班已三月有余,吴总上课也总问“ 咱们的课上了这么多次了大家实践了多少行代码了?”。这里是一个一脸懵逼的表情。该怎么统计呢?一个个文件数当然不可取,能用代码解决的事咱们坚决不动手。最近在网上刷题时也正好遇到有这么一道题,所以决定撸一撸。 

题目:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。 

首先分析一下思路捋一下大象装冰箱的步骤,从一个给定的目录统计该目录下所有的代码行大致需要以下7个步骤:

1. 遍历该目录下所有的文件。

2. 判断文件是否以“.py”结尾。(以python代码为例)

3. 打开.py文件(切忌勿用W+,W+会清空文件内容)

4. 循环读取文件的每一行

5. 判断每一行的内容:

                  (a) 注释: 以#开头。

                  (b) 注释:以三引号开头结束。

                  (c) 空行:除空白字符无其他。

                  (d) 代码行:除空白字符之后还剩下其他字符。

6. 判断是否为文件末尾,    

7. 关闭文件, 返回结果. 

解题思路捋清楚之后剩下的就是将各模块的代码像搭积木一样搭起来就完事了(示例代码在本文最后): 

5~9: 导入OS,定义 code_lines_count 函数并接收一个 path 形式参数,声明了三个变量分别用于统计代码行,注释行和空行 

10~13: 遍历os.walk获取到的file 对象,然后将文件的后缀名利用splitext函数分割然后使用列表索引 [1] 取得文件后缀名,并判断是否是以“.py”结尾。(此处也可以使用listdir, 但listdir只能取单层目录下的文件, 并且需要单独判断取得的元素是文件还是文件夹,较麻烦)

第12行定义了一个file_abs_path的变量并赋值文件的绝对路径,是因为下面的代码会多次使用,不必每次都使用so.path.join(xx,xx)。 

14~18:对于上一个步骤获取到的以“.py”结尾的文件 利用with 方式打开(使用with可省去关闭文件的代码),对于打开的文件使用While True 循环的使用readline()去读取文件的每一行并赋值给line 变量。 

19~39:该段代码用于对上一步骤readline()取得的行做判断是 代码行,空行还是注释行。

         19~21:如果line为空,表示取到文件末尾,此时break while 循环,继续files 中的下一个文件操作。 

         22~24:使用strip()对readline()取得的行做去空白处理,如果经过处理后是以“#”开头则表示这行是一个注释行 此时对comm_lines 做加1 操作。 

         25~33:使用strip()对readline()取得的行做去空白处理,如果经过处理后是以三个单引号或者三个双引号开头则表示此处为一个多行注释的开始,然后判断该行的三引号数量如果为1则表示注释分多行, 否则注释为一行(一对三引号在同一行),对于注释为多行情况使用while 循环得读取接下来的行,并且没读一行对 comm_lines 做加1 操作,如果读到某一行存在三引号则判定注释结束,break 当层while循环(此处只考虑了比较规范的注释) 

         34~36:如果读到的行做过strip()之后非空且不是注释,则是一个代码行, 并对code_lines做加1操作。

         37~39:如果上述条件都不满足,则判断为一个空行,并对space_lines 做加1操作。 

41:返回统计到的代码行,注释行和空行。

43:测试代码下图是运行的一个实例

 

 

1 #_*_coding:utf-8_*_ 2  3 # 统计代码行数, 空行, 注释. 4  5 import os 6 def code_lines_count(path): 7     code_lines = 0 8     comm_lines = 0 9     space_lines = 0    10     for root,dirs,files in os.walk(path):11         for item in files:                12             file_abs_path = os.path.join(root,item)            13             postfix = os.path.splitext(file_abs_path)[1]14             if postfix == '.py':15                 #print 'Start: ',file_abs_path16                 with open(file_abs_path) as fp:17                     while True:18                         line = fp.readline()19                         if not line:20                             #print 'break here,%r' %line21                             break22                         elif line.strip().startswith('#'):23                             #print '1, here',line24                             comm_lines += 125                         elif line.strip().startswith("'''") or line.strip().startswith('"""'):26                             comm_lines += 127                             if line.count('"""') ==1 or line.count("'''") ==1:28                                 while True:29                                     line = fp.readline()30                                     #print '4, here',line31                                     comm_lines += 132                                     if ("'''" in line) or ('"""' in line):33                                         break34                         elif line.strip():35                             #print '5, here',line36                             code_lines += 137                         else:38                             #print '6, here',line39                             space_lines +=140                 #print 'Done',file_abs_path41     return code_lines,comm_lines,space_lines42 #test43 print "Code lines: %d\nComments lines: %d\nWhiteSpace lines: %d" %code_lines_count(r'D:\exercises')

 

 --码代码本质和打游戏一样, 都是打怪升级穿装备。

转载于:https://www.cnblogs.com/chen0427/p/5732245.html

你可能感兴趣的文章
mysql 基础语句
查看>>
【翻译】Sencha Cmd中脚本压缩方法之比较
查看>>
hdu多校第4场E. Matrix from Arrays HDU 二维前缀和
查看>>
Ubuntu下安装Matlab并破解
查看>>
QT-2D编程
查看>>
【转载】Free Lunch is Over(免费午餐已经结束了)
查看>>
leetcode 141. Linked List Cycle 、 142. Linked List Cycle II
查看>>
团队工作第二天
查看>>
python escape sequences
查看>>
【转】Odoo:基本字段类型
查看>>
将中文数字转换层阿拉伯数字
查看>>
用C#调用蓝牙编程
查看>>
图片组件——axure线框图部件库介绍
查看>>
NSString / NSData / char* 类型之间的转换
查看>>
html5 拖放购物车
查看>>
恩尼格码的发明和破解
查看>>
UIAlertController:弹框4步走
查看>>
Java读取txt文件内容
查看>>
国内git项目托管平台
查看>>
linux下memcached安装及php扩展安装配置
查看>>