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读取ini文件、操作mysql、发送邮件实例
Jan 01 Python
Python pass详细介绍及实例代码
Nov 24 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
用Python写一个模拟qq聊天小程序的代码实例
Mar 06 Python
python实现银行管理系统
Oct 25 Python
python selenium实现发送带附件的邮件代码实例
Dec 10 Python
Django CSRF认证的几种解决方案
Mar 03 Python
Python文件读写w+和r+区别解析
Mar 26 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 Python
python 如何调用远程接口
Sep 11 Python
Python 图片处理库exifread详解
Feb 25 Python
用基于python的appium爬取b站直播消费记录
Apr 17 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
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
php 无限级数据JSON格式及JS解析
2010/07/17 PHP
PHP运行模式汇总
2016/11/06 PHP
php 中的closure用法详解
2017/06/12 PHP
php对象工厂类完整示例
2018/08/09 PHP
JS获取URL中参数值(QueryString)的4种方法分享
2014/04/12 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
js中位运算的运用实例分析
2018/12/11 Javascript
Jquery获取radio选中值实例总结
2019/01/17 jQuery
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
python实现感知器算法详解
2017/12/19 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
python爬取代理ip的示例
2020/12/18 Python
selenium携带cookies模拟登陆CSDN的实现
2021/01/19 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
比利时买床:Beter Bed
2017/12/06 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
银行演讲稿范文
2014/01/03 职场文书
县优秀教师事迹材料
2014/01/31 职场文书
班级活动策划书
2014/02/06 职场文书
档案室主任岗位职责
2014/02/12 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
请假条标准格式规范
2014/04/10 职场文书
大三学习计划书范文
2014/05/02 职场文书
企业文化演讲稿
2014/05/20 职场文书
小学新教师个人总结
2015/02/05 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB