- 写了一个查找你写过多少行代码的python脚本,这个是实验室的同学让我做的,他懒得做(忙的写情书),
大一上C语言课,老师说四年写够十万行代码,毕业的时候就是大佬。 还想加一点功能,现在的还是在初级阶段,应该还会有很多bug
先贴代码
import os
import codecs
class count_code:
file_type=["cpp","c","py","java","go"] #用于根据后缀名确定是否为代码文件
file_avoid=["Android","gcc","go","exe4j","matlab","eric","pycharm","Node.js","Lib","lib",
"Scripts","scripts","mysql","Tools","资料盘","鱼C工作室编程教学","Web","SDK",
"IDE","DIA SDK","Apps","MSBuild","VSSDK","MySQL-python","ffmpeg"]
#这个做的是排除一些文件(主要是包括一些语言头文件和库文件,毕竟这些不是你写的,嘿嘿)
#此项功能慎重使用
file_catalog=[]
count={"cpp":0, "c":0, "py":0, "java":0, "go":0}
def count_file(self):
while True:
file=input("请输入要添加的文件目录:")
if os.path.exists(file):
self.file_catalog.append(file) #初始提供要搜索的文件目录,目前直接搜索单个
#代码文件还不行,估计是递归写废了,有时间再改
choose=input("是否继续输入?Y/N\n")
if choose in ['Y','y']:
continue
elif choose in ['N','n']:
break
else:
print("输入有误,请重新输入!")
else:
print("输入有误,请重新输入!")
choose=input("是否继续输入?Y/N\n")
if choose in ['Y','y']:
continue
elif choose in ['N','n']:
break
else:
print("输入有误,请重新输入!")
#self.file_catalog=set(self.file_catalog)
self.cal_file("",self.file_catalog)
def cal_file(self,file_pre,file_catalog): #递归计算文件目录
if "$RECYCLE.BIN" in file_catalog:
file_catalog.remove("$RECYCLE.BIN")
for i in file_catalog:
#print(file_catalog)
#print(i)
try:
if i in self.file_avoid:
continue
if file_pre!="" and file_pre[-1]!="\\":
file_pre+="\\"
if os.path.isfile(file_pre+i):
#print("----------"+file_pre+i)
self.cal_code(file_pre+i)
else:
file_name=(os.listdir(file_pre+i))
self.cal_file(file_pre+i,file_name)
except NotADirectoryError:
print("***********读取目录发生了错误**********") #有些文件目录访问会报错,原因目前不知
continue
except PermissionError:
print("***********拒绝访问**********") #有些文件会拒绝访问,比如".db"的
#SQL server数据库文件
continue
def cal_code(self,file_name):
suffix=file_name.split('.')[-1]
if suffix in self.file_type:
flag=0
while True:
try: #有些文件用"utf-8"解码会失败,我还不太了解为什
#么有的解码方式为什么会导致解码失败,干脆全列出来,能解码就解掉
if flag==0:
f=codecs.open(file_name,'r',"utf-8")
#with codecs.open(file_name,'r',"utf-8") as f:
elif flag==1:
f=codecs.open(file_name,'r',"gbk")
elif flag==2:
f=codecs.open(file_name,'r',"utf-16")
elif flag==3:
f=codecs.open(file_name,'r',"gbk2312")
else:
print("***********解码失败**********")
flag=-1
lines=f.readlines()
except UnicodeDecodeError:
print("***********尝试另一种解码**********")
else:
print(file_name,len(lines))
for i in lines:
if i!='\n':
self.count[suffix]+=1
f.close()
#print(self.count[suffix])
flag=-1
finally:
if flag==-1:
break
else:
flag+=1
#self.count=self.count+len(lines)
def show_count(self):
for i in self.count:
print("后缀名为:"+i+"的代码行数为:",self.count[i],sep="")
if __name__=='__main__':
mycode=count_code()
mycode.count_file()
mycode.show_count()
运行效果如下:
这些代码里还是包括了一些头文件和库文件的,我没有仔细排除
注:并不是用不同的解码方式打开文件会出错,而是打开文件后对文件”readline”或者“readlines”等诸如其他的对文件内容操作时会出错,通常抛出的错误为“UnicodeDecodeError”。
可以改进的地方:
- 加上优先级,即使被认为是头文件和库文件时因为操作者提前设好要访问该文件,所以也要统计;
- 把那个有点小错误的递归改掉;
- python应该有关于图表绘制的库,如果可以形象的显示结果就更好了;
- 可以访问文件时访问该文件创建的时间(Windows应该有这个功能),一同显示在最终的结果里;
- 对超过一定行数的代码文件做标记,比如我现在这个水平,很少写超过一千行的代码。自从用了python后就通常单个文件代码行数就更少了。