Python学习教程:如何使用python统计代码行数,使用re抓取注释,传入目录自动读取和读取计算其下的文件。流程首先判断传入的参数是否为文件夹,如果不是,则打印出提示,否则继续(不返回),得到目录后,yongos.listdir遍历该路径下的文件,其中也包括文件夹,判断是否又是一个文件夹,如果是,就递归调用这个函数,否则开始统计行数,这里使用os.path.join拼接路径和文件名,这样后面可以直接传给函数,逻辑很简单,无非是执行文件判断,判断是哪种类型的文件,调用相应的注释监听正则代码段进行抓取,抓取时行数+1,同样的原则也适用于空行。使用strip(去除前后空格),然后该行内容为空,则为空行,代码段为总行数减去其他两类行数,最后所有文件对应的代码段在外层累加得到总数。可以在key函数内部访问全局变量。问题是在函数内部修改了变量,导致python认为是局部变量。因此,如果在函数内部访问和修改全局变量,应该使用关键字global来修改该变量。importosimportre#定义规则捕获文件中的python注释re_obj_py=re.compile('[(#)]')#定义规则捕获文件中的C语言注释re_obj_c=re.compile('[(//)(/*)(*)(*/)]')#判断是否为python文件defis_py_file(filename):ifos.path.splitext(filename)[1]=='.py':returnTrueelse:returnFalse#判断是否是一个c文件defis_c_file(filename):ifos.path.splitext(filename)[1]in['.c','.cc','.h']:returnTrueelse:returnFalse#定义几个全局变量,用于计算和allfiles(Alllines,codelines,blanklines,commentlines)all_lines,code_lines,space_lines,comments_lines=0,0,0,0#判断是否是文件夹,如果不是,则输出提示defcount_codelines(dirpath):ifnotos.path.isdir(dirpath):print('inputdir:%sisnotlegal!'%dirpath)return#定义几个全局变量计算每个文件的行数(所有行数,代码行数,数量空行数,注释行数)globalall_lines,code_lines,space_lines,comments_lines#列出当前文件夹(包括目录)中的文件all_files=os.listdir(dirpath)forfileinall_files:#加入文件(目录)名称和路径file_name=os.path.join(dirpath,file)ifos.path.isdir(file_name):count_codelines(file_name)else:temp_all_lines,temp_code_lines,temp_space_lines,temp_comments_lines=0,0,0,0f=open(file_name)forlineinf:temp_all_lines+=1ifline.strip()=='':temp_space_lines+=1continueifis_py_file(file_name)andre_obj_py.match(line.strip()):temp_comments_lines+=1ifis_c_file(file_name)andre_obj_c.match(line.strip()):temp_comments_lines+=1temp_code_lines=temp_all_lines-temp_space_lines-temp_comments_linesprint('%-15s:all_lines)(%s)\tcode_lines(%s)\tspace_lines(%s)\tcomments_lines(%s)'%(file,temp_all_lines,temp_code_lines,temp_space_lines,temp_comments_lines))all_lines+=temp_all_linescode_lines+=temp_code_linesspace_lines+=temp_space_linescomments_lines+=temp_comments_linesif__'main__=='__:count_codelines('test')print('\n****TOTALCOUNT****\nall_lines=%s\ncode_lines=%s\nspace_lines=%s\ncomments_lines=%s'%(all_lines,code_lines,space_lines,comments_lines))本期的Python学习教程先跟大家分享这么多!
