写呀写代码,2019 你都写了多少行代码呀

文章目录

  • 自己动手实现一个代码统计工具
    • 导入所需的库
    • 定义要读取的文件地址
    • 指定你要读取的文件类型
    • 遍历目录 / 文件
      • 代码分析
    • 读取代码行数
    • 代码测试
    • 全部代码
    • 打包成可执行程序

注意: 如果只是需要代码运行的可以直接点击目录中的 全部代码

自己动手实现一个代码统计工具

导入所需的库

这个程序需要用到的库有:os,time
这两个库都是 Python 自带的,所以我们直接 import 就行

import os
import time

现在我们已经导入要使用的库了,可以直接写代码了


定义要读取的文件地址

首先,我们定义一个路径吧,因为要读取文件统计代码行数嘛

# 指定读取的路径
base_dir = './'# 定义一个文件列表
file_lists = []
  • base_dir :假设我们读取的是当前目录下的目录 / 文件
  • file_lists:因为我们读取的文件不止一个,所以使用列表来存储

指定你要读取的文件类型

file_type = ['py']

这里以 Python 文件为例,因为代码是用 Python 写的嘛,所以读取 py 为后缀的文件


遍历目录 / 文件

上面我们定义了路径是 ./ (当前目录下),文件类型是 py 的,接下来我们需要遍历一下当前路径中的文件,代码如下:

# 定义一个 getDir_or_File 函数,看名字都应该知道是什么意思了吧
# base_dir 是我们定义的路径(路径为 ./)
def getDir_or_File(base_dir):# 将文件列表定义为全局的global file_lists# 遍历当前目录下所有的目录路径,目录名,文件名for parent,dirnames,filenames in os.walk(base_dir):# 遍历文件名for filename in filenames:# 获取后缀file= filename.split('.')[-1]# 如果获取的后缀是我们定义文件类型if file in file_type:# 将目录路径与文件名连接起来,如('./code.py')file_lists.append(os.path.join(parent,filename))
代码分析

os.walk(top, topdown=True, οnerrοr=None, followlinks=False):输出在文件夹中的文件名通过在树中游走,向上或者向下

  • top :是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。
  • root :所指的是当前正在遍历的这个文件夹的本身的地址
  • dirs : 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
  • files :同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
  • topdown :可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。
  • onerror : 可选,需要一个 callable 对象,当 walk 需要异常时,会调用。
  • followlinks : 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录

这样讲好像不太好理解,我们实践一下,编写以下代码进行测试

import osfor parent, dirnames, filenames in os.walk("./"):print(parent)print(dirnames)print(filenames)

从图中可知道改代码位于 demo 文件夹下

OK,我们运行一下这个程序

没学过 os 库的朋友可能会有点疑问,为什么 for 循环那里要有三个参数?必须的吗?

for parent, dirnames, filenames in os.walk("./"):

是的,是必须的,不信?我们去掉一个参数运行一下,代码如下:

import osfor parent, filenames in os.walk("./"):print(parent)print(filenames)

运行,报错了

报错信息为:ValueError: too many values to unpack (expected 2)
说我们太多值无法解包?(一头雾水)
我们来看下官方是怎么解释的

对于根目录在目录树顶部的每个目录(包括顶部本身,但不包括 ’ . ’ 和 '… '),产生一个三元组目录路径,目录名,文件名

这也就说明了 for 循环中的参数是缺一不可的


读取代码行数

上面我们已经实现了遍历目录和文件了,接下来我们需要读取文件了
说到读取文件相信学习过 Python 的朋友都应该知道,无非就是 open 和 with open,没学习过的朋友也没关系,这里简单教你几下


首先我们定义一个函数 def countLines(file_name): ,具体代码如下:

# 统计一个文件的行数
def countLines(file_name):# 定义一个变量 count,并赋值为 0 count = 0# 这里我们使用 open 函数来读取文件内容,readlines() 的意思是按行读取for file_line in open(file_name,'r',encoding='utf-8').readlines():# 过滤掉空行,空行总不是你写的代码吧对吧if file_line != '' and file_line != '\n': # 满足上面的条件的话就行数 + 1count += 1# 打印文件名和行数print(file_name + '----' , count)# 返回 count,为什么要返回?因为这只是一个文件而已,既然要统计代码行数总不能只统计一个文件吧?return count

注意: open 那里一定要加上编码格式(encoding=‘utf-8’),否则会报以下错误
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x84 in position 48: illegal multibyte sequence

你以为这样就可以了?no,继续上代码:

if __name__ == '__main__' :# 用于基准测试的性能计数器。startTime = time.perf_counter()# 调用 getDir_or_File() 函数来遍历目录 and 文件getDir_or_File(base_dir)# 定义代码总行数的变量,并赋值为 0totallines = 0# 遍历所有文件for filelist in file_lists:# 计算总代码行数totallines = totallines + countLines(filelist)# 打印代码行数print('total lines:',totallines)# 打印程序执行时间print('Success! Cost Time: %0.2f seconds' % (time.perf_counter() - startTime))

代码测试

到这里我们的代码已经编写完成,我们测试一下我们的程序,测试之前我们先准备几个 py 文件


我们在 demo 文件夹下创建了一个 code.py 文件和一个 test 目录,而我们的 test 目录下也有一个 test.py 文件,两个文件的内容是一样的,只是一个没有空行,一个有空行,我们来运行一下我们编写的程序,我们将路径指向 demo 目录

base_dir = './demo'


OK,运行一下程序

从图中我们可以看到程序执行成功了,而且行数也统计出来了,那么统计到底对不对呢?是正确的,我们上面的 code.py 是有空行的,去掉空行就是 13 行,而 test.py 本来就是 13 行且没有空行

全部代码

全部代码如下:

# 导入库
import os
import time# 指定读取的路径
base_dir = '需要指定的路径'# 文件列表
file_lists = []# 指定想要统计的文件类型
file_type = ['py']#遍历文件, 递归遍历文件夹中的所有
# 定义一个 getDir_or_File 函数,看名字都应该知道是什么意思了吧
# base_dir 是我们定义的路径(路径为 ./)
def getDir_or_File(base_dir):# 将文件列表定义为全局的global file_lists# 遍历当前目录下所有的目录路径,目录名,文件名for parent,dirnames,filenames in os.walk(base_dir):# 遍历文件名for filename in filenames:# 获取后缀file= filename.split('.')[-1]# 如果获取的后缀是我们定义文件类型if file in file_type:# 将目录路径与文件名连接起来,如('./code.py')file_lists.append(os.path.join(parent,filename))# 统计一个文件的行数
def countLines(file_name):# 定义一个变量 count,并赋值为 0 count = 0# 这里我们使用 open 函数来读取文件内容,readlines() 的意思是按行读取for file_line in open(file_name,'r',encoding='utf-8').readlines():# 过滤掉空行,空行总不是你写的代码吧对吧if file_line != '' and file_line != '\n': # 满足上面的条件的话就行数 + 1count += 1# 打印文件名和行数print(file_name + '----' , count)# 返回 count,为什么要返回?因为这只是一个文件而已,既然要统计代码行数总不能只统计一个文件吧?return countif __name__ == '__main__' :# 用于基准测试的性能计数器。startTime = time.perf_counter()# 调用 getDir_or_File() 函数来遍历目录 and 文件getDir_or_File(base_dir)# 定义代码总行数的变量,并赋值为 0totallines = 0# 遍历所有文件for filelist in file_lists:# 计算总代码行数totallines = totallines + countLines(filelist)# 打印代码行数print('total lines:',totallines)# 打印程序执行时间print('Success! Cost Time: %0.2f seconds' % (time.perf_counter() - startTime))

打包成可执行程序

其实我们还可以修改一下代码将代码打包成 exe 文件,这样就可以转发给别人使用了,如我们将这个文件命名为 test.py,使用 pyinstaller 打包程序

pyinstaller -F test.py -w

这个实现很简单,但是也有个缺点,就是需要把程序放到你要统计的路径下才能统计不能指定路径统计,其实也差不多,只要把程序放到你要统计的目录就行了,来测试一下:
打包后的程序如下

放到我的一个 Django 项目下,双击 test.exe

双击运行后会在该目录下创建一个 totalcount 的 txt 文本

我们打开这个文本看下,可以看到文本中显示还读取到了 html 了,是自己设置的哈,并不是代码写错了哈哈

一共读取了 19 个文件
376 行代码
用时 0.02s


关于很多朋友问我打包成 exe 运行无法生成 txt 文件,其实还稍作了修改的哈
我把打包好的 exe 放到了码云上面了 文件下载地址,感兴趣的朋友可以去下载哦,喜欢的朋友记得给个star哦,非常感谢

来测试下 2019 你一共写了多少行代码?相关推荐

  1. webstorm代码行数统计_来测试下 2019 你一共写了多少行代码?

    写啊写代码,2019 你都写了多少行代码呢 自己动手实现一个代码统计工具 导入所需的库 这个程序需要用到的库有:os,time 这两个库都是 Python 自带的,所以我们直接 import 就行 i ...

  2. python实现统计你一共写了多少行代码

    程序员要保证一定的代码量就必须勤奋的敲代码,但怎么知道自己一共写了多少代码呢,笔者用python写了个简单的脚本,遍历所有的.java,.cpp,.c文件的行数,但是正如大家所知,java生成了许多代 ...

  3. Python 在腾讯研发排第 5,鹅厂 2019 年新增 12.9 亿行代码

    综合整理:程序员的那些事(id:iProgrammer) 2020 年元旦,蚂蚁金服在其元旦微博中提到,支付宝在 2019 年一共新增了 4 亿代码. 近日,腾讯发布了<2019 年腾讯研发大数 ...

  4. 《看聊天记录都学不会C语言?太菜了吧》(14)这么神奇?我写了20行代码竟然一行就可以搞定?

    好消息2020年4月13日晚7.30我在CSDN开播,等你来聊天 预约连接:https://live.csdn.net/room/A757291228/MJWK0Gem 本系列文章将会以通俗易懂的对话 ...

  5. 这一年里,你一共写了34万行代码

    web前端教程 用大白话,来讲编程 这一年里,你一共写了 34万 行代码: 你热衷于使用组合键 Ctrl+C 以及 Ctrl+V : 喜欢和同事一起讨论你们 两个都不懂 的技术知识: 你热爱学习,每天 ...

  6. 女神相册密码忘记了,我只用Python写了20行代码

    ​视频地址 我用20行代码,帮女神破解相册密码 一.事情是这样的 今早上班,公司女神小姐姐说,她去年去三亚旅游的照片打不开了 好奇问了一下才知道. 原来是,她把照片压缩了,而且还加了密码. 但是密码不 ...

  7. 写过25W行代码,3个操作系统:我如何做架构设计,来降低代码复杂度?

    来源| 美团技术团队 作者| 政华,顺谱,陶鑫 导读:本文是作者阅读John Ousterhout的<A Philosophy of Software Design>之后,结合自己的工作经 ...

  8. python画人脸编程怎么写_Python 40行代码实现人脸识别功能

    前言 很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了.这些人里包括曾经的我自己.其实如果如果你不是非要深究其中的原理,只是要实现这 ...

  9. 知道这20个正则表达式,能让你少写1,000行代码

    2019独角兽企业重金招聘Python工程师标准>>> 正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑.熟练地掌 ...

最新文章

  1. python怎么让x轴45°展示_python opencv实现任意角度的透视变换实例代码
  2. (HDU)1091 --A+B for Input-Output Practice (III)(输入输出练习(III))
  3. linux环境双网卡主机路由配置
  4. 【控制】四旋翼无人机姿态角分析
  5. 模型OnMouseXXX事件
  6. C# 图片画矩形,添加文字
  7. 生物医学基础--讲不明白12导联算我输
  8. 浏览器最小显示12px字体的解决方法
  9. [python 译] 基于面向对象的分析和设计
  10. Atitit 集合分组聚合操作sum count avg java版本groovy版本 目录 1. //按性别统计用户数 1 7. //按性别获取用户名称 1 16. //按性别求年龄的总和 1 2
  11. 在CNDS博客中插入Latex公式
  12. python zip压缩_用Python处理ZIP压缩包
  13. 珊瑚--shopee平台提现流程
  14. vue中.lazy 相当于change事件
  15. 最新电脑cpu性能排行服务器,服务器cpu性能如何 服务器cpu性能排行榜介绍【详解】...
  16. 嵌入式要学习哪些内容?
  17. 【数据分析可视化】股票市场分析实战之风险分析
  18. 频域串联滞后校正matlab,控制工程基础(基于Matlab的线性系统串联校正)
  19. O2O常见的结算模式是什么 O2O线上线下营销策略有哪些?
  20. html自动淡入淡出,纯css实现淡入淡出_html/css_WEB-ITnose

热门文章

  1. 通过虚拟磁盘技术给电脑安装双系统或多系统
  2. 解密m3u8/ts视频流
  3. 虚拟机安装FreeBSD
  4. Linux下DES安全通信编程
  5. 开发必备神器,你值得拥有!
  6. 服务器电源ic芯片,AC-DC适配器电源IC芯片方案选型表
  7. JVM监控及诊断工具-GUI
  8. 【获取百度云盘直链】
  9. ubuntu16.04 python版本切换以及pip工具基本知识点总结
  10. 钟汉良日记:为何我持续写日记四十天后,让他精神层面完全被影响?