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中的变量和作用域详解
Jul 13 Python
利用pyinstaller将py文件打包为exe的方法
May 14 Python
如何在python字符串中输入纯粹的{}
Aug 22 Python
对python中Librosa的mfcc步骤详解
Jan 09 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
Jul 23 Python
pygame实现打字游戏
Feb 19 Python
解决pytorch报错:AssertionError: Invalid device id的问题
Jan 10 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 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
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
判断控件是否已加载完成的代码
2010/02/24 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
Vue项目中使用jsonp抓取跨域数据的方法
2019/11/10 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
python中的随机函数random的用法示例
2018/01/27 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
关于Python-faker的函数效果一览
2019/11/28 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
法国家具及室内配件店:home24
2017/01/21 全球购物
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
中间件的定义
2016/08/09 面试题
税务干部个人整改措施思想汇报
2014/10/10 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
沈阳故宫导游词
2015/01/31 职场文书
现役军人家属慰问信
2015/03/24 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
HTML+CSS 实现顶部导航栏菜单制作
2021/06/03 HTML / CSS
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL