利用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:测试代码下图是运行的一个实例

 1 #_*_coding:utf-8_*_
 2
 3 # 统计代码行数, 空行, 注释.
 4
 5 import os
 6 def code_lines_count(path):
 7     code_lines = 0
 8     comm_lines = 0
 9     space_lines = 0
10     for root,dirs,files in os.walk(path):
11         for item in files:
12             file_abs_path = os.path.join(root,item)
13             postfix = os.path.splitext(file_abs_path)[1]
14             if postfix == ‘.py‘:
15                 #print ‘Start: ‘,file_abs_path
16                 with open(file_abs_path) as fp:
17                     while True:
18                         line = fp.readline()
19                         if not line:
20                             #print ‘break here,%r‘ %line
21                             break
22                         elif line.strip().startswith(‘#‘):
23                             #print ‘1, here‘,line
24                             comm_lines += 1
25                         elif line.strip().startswith("‘‘‘") or line.strip().startswith(‘"""‘):
26                             comm_lines += 1
27                             if line.count(‘"""‘) ==1 or line.count("‘‘‘") ==1:
28                                 while True:
29                                     line = fp.readline()
30                                     #print ‘4, here‘,line
31                                     comm_lines += 1
32                                     if ("‘‘‘" in line) or (‘"""‘ in line):
33                                         break
34                         elif line.strip():
35                             #print ‘5, here‘,line
36                             code_lines += 1
37                         else:
38                             #print ‘6, here‘,line
39                             space_lines +=1
40                 #print ‘Done‘,file_abs_path
41     return code_lines,comm_lines,space_lines
42 #test
43 print "Code lines: %d\nComments lines: %d\nWhiteSpace lines: %d" %code_lines_count(r‘D:\exercises‘)

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

时间: 2024-10-05 14:04:53

利用python统计代码行的相关文章

Python学习教程:如何用python统计代码行数

Python学习教程:如何用python统计代码行数 改良后的代码可以对python和C系列的代码实行行数计算,包括代码.空行和注释行,用re抓取注释,传入一个目录自动对其下的文件进行读取计算 流程 首先判断传入参数是否为文件夹,不是则打印出提示,否则继续(无返回),获得目录后,yongos.listdir对路径下文件进行遍历,其中也包含文件夹,再次判断是否为文件夹,是的话则递归调用此函数,否则开始执行行数统计,这里用os.path.join将路径与文件名进行拼接,方便之后直接传给函数,逻辑很简

Python 统计代码行

正在学习 Python, 做了个统计代码行的功能, 参考了网上很多前辈的帖子,添加了感觉还是比较实用的功能, 只是windows下测试了,而且代码文件编码形式是 utf-8的. 如果使用其它编码形式的话,估计修改下代码就行了. 功能特点: 是否统计空行 统计注释 设置忽略文件平 设置统计文件类型 根据不同文件类型,设置注释标签 以下,是代码: 1 # Created by Aaron <[email protected]> in 2014 2 # This code is for Python

python实现代码行的统计

最近闲来无事写了一个统计C或者C++代码行数的程序,主要用到了python以及正则表达式 #-*-coding:utf-8 #!/usr/bin/python import re import os import sys '''get the file or dir in one path''' def getfilename(path): if os.path.exists(path): filelist = os.listdir(path) return filelist '''get th

python统计代码总行数(代码行、空行、注释行)

我们在工作或学习代码的过程中,经常会想知道自己写了多少行代码,今天在项目环境写了个脚本统计了项目代码的数量. 功能: 1.统计代码总行数 2.统计空行数 3.统计注释行数 # coding=utf-8 import os #定义代码所在的目录 base_path = '/home/yhl/workspace/xtp_test' #在指定目录下统计所有的py文件,以列表形式返回 def collect_files(dir): filelist = [] for parent,dirnames,fi

Visual Studio统计代码行数

Visual Studio统计代码行数 按[Ctrl+Shift+F]弹出查找窗口(不统计以#号开头.以/开头的代码和空行) 1.输入  :b*[^:b#/]+.*$ 2.选择使用正则表达式 3.查找文件类型,*.cs多种类型用分号(;)隔开 点击查找全部(查找结果如下)

VS统计代码行数 CTRL+SHIFT+F

1.CTRL+SHIFT+F (Find in files),打开查找功能(如果打不开查看本文最后)2. 勾选 使用:正则表达式,3. 搜索内容: ^:b*[^:b#/]+.*$ #开头和/开头或者空行都不计入代码量. ^:b*[^:b#/*]+.*$ *开头和#开头和/开头或者空行都不计入代码量. 4. 最后一行就是代码行数了. 匹配行:    匹配文件:    合计搜索文件: ----------------------------------------------------------

[转]Linux统计代码行数

wc -l *.c *.h 就可以知道当前目录下的所有c 和 h 文件的行数的详细信息.很不错 如果要递归,可以配合其他命令一起使用 当前目录及子目录: find . -name *.c |xargs wc -l find . -name *.cpp | xargs wc -l find . -name *.h |xargs wc -l 想一下子 ,或许简单的可以 使用重定向技术 使用 find -name "*.c">/tmp/file.list ;find -name &qu

【Linux】常用命令-统计代码行数

公司人员流动大,经常有新的维护任务,交接时喜欢看看新来的模块的代码量,那么问题来了, 如何统计代码行数? 1,最先想到的肯定是 wc. wc -l *.h 将查看[当前目录]下头文件的代码行数,输出结果如下: [groot]$wc -l *.h 54 consts.h 60 crc32.h 169 crypt.h 301 ebcdic.h 443 globals.h 39 inflate.h 81 timezone.h 227 ttyio.h 722 unzip.h 3123 unzpriv.h

一个统计代码行数的简单方法

安装Git, 到项目目录下右击->Git Bash, 输入命令: find . -name "*.cs" | xargs wc -l 效果如下, 还是挺简便的. 一个统计代码行数的简单方法,布布扣,bubuko.com