Python入门之用Python统计代码行

Pycharm每天都要写很多代码,如何统计每天的代码行数呢?作为一个目标十万行的coder,要想想办法!

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

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

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

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

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

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

5. 判断每一行的内容:

                  (a) 注释: 以#开头。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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':


                with open(file_abs_path) as fp:
                    while True:
                        line = fp.readline()
                        if not line:

                            break
                        elif line.strip().startswith('#'):

                            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()

                                    comm_lines += 1
                                    if ("'''" in line) or ('"""' in line):
                                        break
                        elif line.strip():

                            code_lines += 1
                        else:

                            space_lines +=1

    return code_lines,comm_lines,space_lines

if __name__ == '__main__':
    abs_dir = os.getcwd()
    x,y,z = code_lines_count(abs_dir)
    print(x,y,z)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏对角另一面

读Zepto源码之Callbacks模块

Callbacks 模块并不是必备的模块,其作用是管理回调函数,为 Defferred 模块提供支持,Defferred 模块又为 Ajax 模块的 promi...

2210
来自专栏GreenLeaves

Jquery filter()方法简介

利用filter函数可以从wrapper set中过滤符合条件的dom元素。 如下图html代码,假如我们要获取类名为filter的<a>标签,用filter方...

2059
来自专栏性能与架构

快速了解 YAML

什么是 YAML? YAML 是一个数据序列化的标准,适用于所有开发语言,最大的特点是可读性好 YAML 的一个主要应用方向就是编写配置文件,有非常多的系统和框...

3955
来自专栏Linux驱动

编译make的出错提示解决方案

编译出错笔记: start.s:20: Error: no such instruction: `ldr r0,=WTCON' 错误:没有这样的指令 解决...

18210
来自专栏有趣的Python

7-Java常用工具类-多线程

我们程序员边听音乐边写代码再挂着qq,这三个软件可以同时运行就是我们的进程在起作用。

1333
来自专栏C/C++基础

Linux命令(32)——grep命令

grep(Globally search a Regular Expression and Print)是GNU开发的一款免费开源的文本搜索工具。grep家族包...

1423
来自专栏同步博客

Smarty的基本使用与总结

含义:Smarty是PHP的一个引擎模板,可以更好的进行逻辑与显示的分离,即我们常说的MVC,这个引擎的作用就是将C分离出来。

923
来自专栏杨建荣的学习笔记

shell基础学习总结(二) (r3笔记第72天)

-->关于shell编程之文件比较 可以使用如下的选项来做文件的比较。有了这些选项,文件的比较来说都是游刃有余。 -d file file是否存在...

2554
来自专栏IMWeb前端团队

简单而强大的swig.js

本文作者:IMWeb json 原文出处:IMWeb社区 未经同意,禁止转载 swig的简单介绍 swig是JS模板引擎,它有如下特点: 根据路劲渲染...

2729
来自专栏游戏杂谈

Node.js文件编码格式的转换

项目很多 lua 文件不是 utf-8格式,使用 EditPlus 查看的时候,显示为ASCII。还有的是带BOM的,带BOM倒好处理,之前写过,有一定规律。

1864

扫码关注云+社区

领取腾讯云代金券