Python 统计代码行

正在学习 Python, 做了个统计代码行的功能,

参考了网上很多前辈的帖子,添加了感觉还是比较实用的功能,

只是windows下测试了,而且代码文件编码形式是 utf-8的。

如果使用其它编码形式的话,估计修改下代码就行了。

功能特点:

是否统计空行

统计注释

设置忽略文件平

设置统计文件类型

根据不同文件类型,设置注释标签

以下,是代码:

  1 # Created by Aaron <[email protected]> in 2014
  2 # This code is for Python 3.4
  3
  4 import os, sys
  5 import traceback
  6
  7 def strToBool(v):
  8     return v.lower() in ("yes", "true", "t", "1")
  9
 10 exts = [‘.js‘, ‘.html‘, ‘.css‘, ‘.h‘, ‘cpp‘]
 11 commentTags = [‘//,/* */‘,‘<!-- -->‘,‘/* */‘, ‘//, /* */‘, ‘//, /* */‘,‘//, /* */‘]
 12 commentTypeIndex = [‘.js‘, ‘.html‘, ‘.css‘, ‘.cs‘, ‘.cpp‘, ‘.h‘]
 13 ignor_folders = [‘debug‘, ‘release‘, ‘ipch‘, ‘output‘, ‘.svn‘, ‘.git‘, ‘durango‘, ‘bld‘, ‘layout‘]
 14 max_line_limit = 2000
 15
 16 count_empty_line = False
 17 if len(sys.argv) > 1:
 18     here = sys.argv[1]
 19 else:
 20     here = sys.argv[0]
 21
 22 if(len(sys.argv) > 2):
 23     exts = sys.argv[2].split()
 24 if(len(sys.argv) > 3):
 25     count_empty_line = strToBool(sys.argv[3])
 26
 27
 28 def read_line_count(fname):
 29     count = 0
 30     comment_count = 0
 31
 32     is_in_multi_comment = False
 33     multi_line_comment_tag_tailer = ‘‘
 34     for line in open(fname, encoding=‘utf-8‘).readlines():
 35         if count_empty_line and len(line.strip()) == 0:
 36             count += 1
 37         else:
 38             if len(line.strip()) > 0:
 39                 count += 1
 40
 41                 # count  comment
 42                 if(is_in_multi_comment):
 43                     comment_count += 1
 44
 45                     if(line.find(multi_line_comment_tag_tailer) >= 0):
 46                         is_in_multi_comment = False
 47                 else:
 48                     ext = (fname[fname.rindex(‘.‘):]).lower()
 49                     if ext not in commentTypeIndex:
 50                         continue
 51
 52
 53                     for commentTag in commentTags[commentTypeIndex.index(ext)].split(‘,‘):
 54                         if(len(commentTag.split()) == 1):
 55                             # single line comment
 56                             if line.strip().startswith(commentTag):
 57                                 comment_count += 1
 58                             else:
 59                                 if(line.find(commentTag) >= 0):
 60                                     comment_count += 1
 61
 62                         else:
 63                             # multi line comment
 64                             multi_line_comment_tags = commentTag.split()
 65                             multi_line_comment_tag_header = multi_line_comment_tags[0]
 66                             multi_line_comment_tag_tailer = multi_line_comment_tags[1]
 67
 68                             if line.find(multi_line_comment_tag_header) >= 0:
 69                                 comment_count += 1
 70                                 is_in_multi_comment = True
 71                             if line.find(multi_line_comment_tag_tailer) >= 0:
 72                                 is_in_multi_comment = False
 73
 74     return count,comment_count
 75 if __name__ == ‘__main__‘:
 76     line_count = 0
 77     file_count = 0
 78     comment_line_count = 0
 79
 80     subFolderCount = 0;
 81     for base, dirs, files in os.walk(here):
 82         for file in files:
 83             #print(file)
 84             # Check the sub directorys
 85             if file.find(‘.‘) < 0:
 86                 #print(file)
 87                 continue
 88
 89             ext = (file[file.rindex(‘.‘):]).lower()
 90             try:
 91                 if ext in exts:
 92                     path = os.path.join(base,file)
 93                     relative_path = path[len(here):].replace(file,‘‘).lower()
 94                     is_ignore = False
 95                     for ignorFolder in ignor_folders:
 96                         if relative_path.find(ignorFolder) >= 0:
 97                             is_ignore = True
 98                             break;
 99                     if is_ignore:
100                         continue
101
102                     c,c2 = read_line_count(path)
103                     if max_line_limit > 0:
104                         if c > max_line_limit:
105                             continue
106
107                     file_count += 1
108
109                     print ("\t.%s : %d  %d" % (path[len(here):], c, c2))
110                     line_count += c
111                     comment_line_count += c2
112                 #else:
113                     #print(file, "is not in list")
114             except Exception as N:
115                 print(traceback.format_exc())
116                 pass
117     print (‘File count : %d‘ % file_count)
118     print (‘Line count : %d‘ % line_count)
119     print (‘Comment line count : %d‘ % comment_line_count)
120     print (‘Comment rage is {:.2%}‘.format ( comment_line_count / line_count))

时间: 2024-10-10 02:49:48

Python 统计代码行的相关文章

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

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

利用python统计代码行

参加光荣之路测试开发班已三月有余,吴总上课也总问“ 咱们的课上了这么多次了大家实践了多少行代码了?”.这里是一个一脸懵逼的表情.该怎么统计呢?一个个文件数当然不可取,能用代码解决的事咱们坚决不动手.最近在网上刷题时也正好遇到有这么一道题,所以决定撸一撸. 题目:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来. 首先分析一下思路捋一下大象装冰箱的步骤,从一个给定的目录统计该目录下所有的代码行大致需要以下7个步骤: 1. 遍历该目录下所有的文件. 2.

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