写啊写代码,2019 你都写了多少行代码呢
自己动手实现一个代码统计工具
导入所需的库
这个程序需要用到的库有:os,time
这两个库都是 Python 自带的,所以我们直接 import 就行
<code>
import
osimport
time/<code>现在我们已经导入要使用的库了,可以直接写代码了
定义要读取的文件地址
首先,我们定义一个路径吧,因为要读取文件统计代码行数嘛
<code>
base_dir
='./'
file_lists
= []/<code>base_dir :假设我们读取的是当前目录下的目录 / 文件file_lists:因为我们读取的文件不止一个,所以使用列表来存储指定你要读取的文件类型
<code>
file_type
= ['py'
这里以 Python 文件为例,因为代码是用 Python 写的嘛,所以读取 py 为后缀的文件
遍历目录 / 文件
上面我们定义了路径是 ./ (当前目录下),文件类型是 py 的,接下来我们需要遍历一下当前路径中的文件,代码如下:
<code>
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:
file_lists.append(os.path.join(parent,filename))
/<code>代码分析
os.walk(top, topdown=True, οnerrοr=None, followlinks=False):输出在文件夹中的文件名通过在树中游走,向上或者向下
这样讲好像不太好理解,我们实践一下,编写以下代码进行测试
<code>import
os
for
parent, dirnames, filenamesin
os
.walk("./"
):从图中可知道改代码位于 demo 文件夹下
OK,我们运行一下这个程序
没学过 os 库的朋友可能会有点疑问,为什么 for 循环那里要有三个参数?必须的吗?
<code>
for
parent
,dirnames
,filenames
in
os
.walk
("./"
):/<code>是的,是必须的,不信?我们去掉一个参数运行一下,代码如下:
<code>import
os
for
parent, filenamesin
os
.walk("./"
):运行,报错了
报错信息为:ValueError: too many values to unpack (expected 2)
说我们太多值无法解包?(一头雾水)
我们来看下官方是怎么解释的
对于根目录在目录树顶部的每个目录(包括顶部本身,但不包括 ’ . ’ 和 '… '),产生一个三元组目录路径,目录名,文件名
这也就说明了 for 循环中的参数是缺一不可的
读取代码行数
上面我们已经实现了遍历目录和文件了,接下来我们需要读取文件了
说到读取文件相信学习过 Python 的朋友都应该知道,无非就是 open 和 with open,没学习过的朋友也没关系,这里简单教你几下
首先我们定义一个函数 def countLines(file_name): ,具体代码如下:
<code>
def
countLines
(file_name)
: count =0
for
file_linein
open(file_name,'r'
,encoding='utf-8'
).readlines():if
file_line !=''
and
file_line !='\n'
: count +=1
print(file_name +'----'
, count)return
count/<code>注意: open 那里一定要加上编码格式(encoding=‘utf-8’),否则会报以下错误 UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x84 in position 48: illegal multibyte sequence
你以为这样就可以了?no,继续上代码:
<code>
if
__name__ =='__main__'
: startTime = time.perf_counter() getDir_or_File(base_dir) totallines = 0for
filelistin
file_lists: totallines = totallines + countLines(filelist)'total lines:'
'Success! Cost Time: %0.2f seconds'
% (time.perf_counter() - startTime))/<code>代码测试
到这里我们的代码已经编写完成,我们测试一下我们的程序,测试之前我们先准备几个 py 文件
我们在 demo 文件夹下创建了一个 code.py 文件和一个 test 目录,而我们的 test 目录下也有一个 test.py 文件,两个文件的内容是一样的,只是一个没有空行,一个有空行,我们来运行一下我们编写的程序,我们将路径指向 demo 目录
<code>
base_dir
='./demo'
/<code>OK,运行一下程序
从图中我们可以看到程序执行成功了,而且行数也统计出来了,那么统计到底对不对呢?是正确的,我们上面的 code.py 是有空行的,去掉空行就是 13 行,而 test.py 本来就是 13 行且没有空行
全部代码
全部代码如下:
<code>讨论学习群:
887934385
分享python资料import
osimport
time base_dir ='需要指定的路径'
file_lists = [] file_type = ['py'
]def
getDir_or_File
(base_dir)
:global
file_listsfor
parent,dirnames,filenamesin
os.walk(base_dir):for
filenamein
filenames: file= filename.split('.'
)[-1
]if
filein
file_type: file_lists.append(os.path.join(parent,filename))def
countLines
(file_name)
: count =0
for
file_linein
open(file_name,'r'
,encoding='utf-8'
).readlines():if
file_line !=''
and
file_line !='\n'
: count +=1
print(file_name +'----'
, count)return
countif
__name__ =='__main__'
: startTime = time.perf_counter() getDir_or_File(base_dir) totallines =0
for
filelistin
file_lists: totallines = totallines + countLines(filelist) print('total lines:'
,totallines) print('Success! Cost Time: %0.2f seconds'
% (time.perf_counter() - startTime))/<code>打包成可执行程序
其实我们还可以修改一下代码将代码打包成 exe 文件,这样就可以转发给别人使用了,如我们将这个文件命名为 test.py,使用 pyinstaller 打包程序
<code>
pyinstaller
-F
test
.py
-w
/<code>这个实现很简单,但是也有个缺点,就是需要把程序放到你要统计的路径下才能统计不能指定路径统计,其实也差不多,只要把程序放到你要统计的目录就行了,来测试一下:
打包后的程序如下
放到我的一个 Django 项目下,双击 test.exe
双击运行后会在该目录下创建一个 totalcount 的 txt 文本
我们打开这个文本看下,可以看到文本中显示还读取到了 html 了,是自己设置的哈,并不是代码写错了
一共读取了 19 个文件
376 行代码
用时 0.02s
关于很多朋友问我打包成 exe 运行无法生成 txt 文件,其实还稍作了修改的
我把打包好的 exe 放到了Github了 文件下载地址,想要的朋友可以去下载,喜欢的朋友记得给个star,非常感谢
更多的精彩技术文章可关注公众号python社区营,提供源码、视频教程