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之有点简约的元组
Sep 24 Python
Python判断操作系统类型代码分享
Nov 22 Python
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
Python中取整的几种方法小结
Jan 06 Python
Python中常用信号signal类型实例
Jan 25 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
python实现简单日志记录库glog的使用
Dec 13 Python
Python 将json序列化后的字符串转换成字典(推荐)
Jan 06 Python
Django Admin后台添加数据库视图过程解析
Apr 01 Python
Python json转字典字符方法实例解析
Apr 13 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
Mar 03 Python
Python+OpenCV实现在图像上绘制矩形
Mar 21 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通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
Js 本页面传值实现代码
2009/05/17 Javascript
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
Python3如何解决字符编码问题详解
2017/04/23 Python
python requests 测试代理ip是否生效
2018/07/25 Python
Python面向对象进阶学习
2019/05/21 Python
pybind11在Windows下的使用教程
2019/07/04 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
python Matplotlib模块的使用
2020/09/16 Python
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
求职简历自荐信范文
2013/10/21 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
python urllib库的使用详解
2021/04/13 Python
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS