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)
最新文章
- Flume_使用
- ubuntu搭建svn服务器(转)
- 通过SEP禁用USB
- [ZOJ 1003] Crashing Balloon (dfs搜索)
- C#中sealed关键字
- 把json格式对象转成可提交字符串格式,会过滤掉函数 {a: {b: 3}, b: [1], c: ";d";} ->; a.b=3&;b[0]=1&;c=d
- ASP.NET使用EasyUI-DataGrid + ashx + JQuery Ajax:实现数据的增删查改,查询和分页!
- [cocos2d]关于CCSprite的若干问题与误区
- Python的maketrans() 方法
- [Swust OJ 249]--凸包面积
- Vs2010 WPF 项目打包
- linux安装ssh服务
- chapter4 module and port
- C#中隐式运行CMD命令行窗口的方法
- 第25章:MongoDB-文档存储[理解]
- (转)WAVE PCM 声音文件格式
- DIY-组装
- (未解决)记录一次登录&;jmeter,留下的一地鸡毛
- 洛谷P3994 Highway(树形DP+斜率优化+可持久化线段树/二分)
- JS中数组那些事~
热门文章
- 关于 Java 泛型的一些有趣的例子
- 在排序模型方面,点评搜索也经历了业界比较普遍的迭代过程:从早期的线性模型LR,到引入自动二阶交叉特征的FM和FFM,到非线性树模型GBDT和GBDT+LR,到最近全面迁移至大规模深度学习排序模型。
- 服务器端FIN的条件
- win7 链接打印机时提示未知的用户名或错误密码
- Service 的 onStartCommand(Intent, int, int) 返回值
- 【生产问题】LDF丢失
- 006-spring cloud gateway-GatewayAutoConfiguration核心配置-GatewayProperties初始化加载、Route初始化加载
- react-native run-android error: unknown host service
- thinkpad X1 extreme 安装Ubuntu 18.04.2 LTS
- linux 使用文件作为交换分区