Python实现统计代码行的方法分析


Posted in Python onJuly 12, 2017

本文实例讲述了Python实现统计代码行的方法。分享给大家供大家参考,具体如下:

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

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

首先分析一下思路捋一下大象装冰箱的步骤,从一个给定的目录统计该目录下所有的代码行大致需要以下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:测试代码下图是运行的一个实例

Python实现统计代码行的方法分析

#_*_coding:utf-8_*_

# 统计代码行数, 空行, 注释.

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':
        #print 'Start: ',file_abs_path
        with open(file_abs_path) as fp:
          while True:
            line = fp.readline()
            if not line:
              #print 'break here,%r' %line
              break
            elif line.strip().startswith('#'):
              #print '1, here',line
              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()
                  #print '4, here',line
                  comm_lines += 1
                  if ("'''" in line) or ('"""' in line):
                    break
            elif line.strip():
              #print '5, here',line
              code_lines += 1
            else:
              #print '6, here',line
              space_lines +=1
        #print 'Done',file_abs_path
  return code_lines,comm_lines,space_lines
#test
print "Code lines: %d\nComments lines: %d\nWhiteSpace lines: %d" %code_lines_count(r'D:\exercises')

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

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python和php通信乱码问题解决方法
Apr 15 Python
Python实现LRU算法的2种方法
Jun 24 Python
Python获取邮件地址的方法
Jul 10 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
python2.x实现人民币转大写人民币
Jun 20 Python
Python超越函数积分运算以及绘图实现代码
Nov 20 Python
python创建子类的方法分析
Nov 28 Python
python新式类和经典类的区别实例分析
Mar 23 Python
详解Python直接赋值,深拷贝和浅拷贝
Jul 09 Python
Python使用socket模块实现简单tcp通信
Aug 18 Python
Python logging日志库空间不足问题解决
Sep 14 Python
详解Python中list[::-1]的几种用法
Nov 16 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 #Python
python 数据的清理行为实例详解
Jul 12 #Python
python的pdb调试命令的命令整理及实例
Jul 12 #Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 #Python
python 中split 和 strip的实例详解
Jul 12 #Python
Python实现简单的获取图片爬虫功能示例
Jul 12 #Python
python文件特定行插入和替换实例详解
Jul 12 #Python
You might like
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
点击广告后才能获得下载地址
2006/10/26 Javascript
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
jquery remove方法应用详解
2012/11/22 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
vue用BMap百度地图实现即时搜索功能
2019/09/26 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
python每隔N秒运行指定函数的方法
2015/03/16 Python
Python实现控制台输入密码的方法
2015/05/29 Python
python 字典(dict)按键和值排序
2016/06/28 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
python import 上级目录的导入
2020/11/03 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
大学生家政服务项目创业计划书
2014/01/30 职场文书
英语教师岗位职责
2014/03/16 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang