递归深度
题目4. 写一个程序统计你当前代码量的总和,并显示离十万行代码量还有多远?要求一:递归搜索各个文件夹
要求二:显示各个类型的源文件和源代码数量
要求三:显示总行数与百分比
我的代码
import easygui as g
import os
def code_line(file):
lines = 0
tal_line = 0
with open(file,'rb') as code_file:
for i in code_file:
lines += 1
tal_line += 1
return lines,tal_line
def Search_file(path = ''):
for each in os.listdir(os.curdir):
file_type = os.path.splitext(each)
if file_type in ['.py','.c','.pas']:
lines,tal_line = code_line(each)
try:
file_dict += 1
except KeyError:
file_dict = 1
try:
line_dict += lines
except KeyError:
line_dict = lines
if os.path.isdir(each):
Search_file(each)
os.chdir(os.pardir)
return tal_line
def show_file():
process = total_line / 100000 * 100
distance = 100000 - percentage
msg = '您目前累计编写了%s行代码,完成度%.2f%%\n离十万行代码还差%s行,请继续努力' % (total_lines,process,distance)
content = ''
for i in file_dict:
content += '【.%s】文件%s个,源代码%行\n' % (i,file_dict,line_dict)
g.textbox(msg,text=content)
line_dict = {}
file_dict = {}
code_path = g.diropenbox('请选择你的代码库')
os.chdir(code_path)
total_lines = Search_file()
show_file()
由于不能正常运行逻辑部分我也不敢确定正确,然后python给了一个报错提示:
C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\python.exe D:/py文件/习题/当前代码量的总和.py
Traceback (most recent call last):
File "D:/py文件/习题/当前代码量的总和.py", line 47, in <module>
total_lines = Search_file()
File "D:/py文件/习题/当前代码量的总和.py", line 28, in Search_file
Search_file(each)
File "D:/py文件/习题/当前代码量的总和.py", line 28, in Search_file
Search_file(each)
File "D:/py文件/习题/当前代码量的总和.py", line 28, in Search_file
Search_file(each)
File "D:/py文件/习题/当前代码量的总和.py", line 16, in Search_file
file_type = os.path.splitext(each)
File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\ntpath.py", line 208, in splitext
return genericpath._splitext(p, '\\', '/', '.')
File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\genericpath.py", line 131, in _splitext
sepIndex = max(sepIndex, altsepIndex)
RecursionError: maximum recursion depth exceeded in comparison
本帖最后由 sunrise085 于 2020-10-13 09:58 编辑
你的程序问题在于Search_file函数的参数path你并没有用到,这就导致递归的时候传进去的子路径并没有被检索,一直使用的都是同一个目录,导致了无限递归,最终超出递归最大次数。。。
if os.path.isdir(each):
Search_file(each)#这里给出的参数each,在 Search_file函数中根本没有用到过,所以你递归的时候,其实还是在原路径下查询,这样一来就造成了无限递归
os.chdir(os.pardir)
修改方法有两种,前后调用的时候一致即可
第一种,修改递归的时候的代码,使其与最开始调用的时候方式一致,在递归前将当前路径改为子目录路径
if os.path.isdir(each):
os.chdir(each)
Search_file()
os.chdir(os.pardir)
第二种,修改Search_file函数,使其与递归时候调用方式一致,在Search_file中修改当前路径
code_path = g.diropenbox('请选择你的代码库')
os.chdir(code_path)#这一行作用hi设置当前工作路径,应该放到Search_file函数里面去
total_lines = Search_file()#这里给出调用参数,即total_lines = Search_file(code_path),在Search_file函数中最开始添加一行,用来设置当前工作路径os.chdir(path)
show_file()以上是解决无限递归的问题。你的程序可能还有其他问题,你再看看吧。Search_file是有返回值的,但是递归的时候,你却没管返回值,我没有详细看,你自己检查一下 sunrise085 发表于 2020-10-13 09:55
你的程序问题在于Search_file函数的参数path你并没有用到,这就导致递归的时候传进去的子路径并没有被检索 ...
请问下,二进制模式读取,和文本模式读取有什么区别,我用小甲鱼的代码,和我自己写的都会出现一个错误,用文本模式打开,记录的行数与实际行数不一样,用二进制打开记录的行数基本与实际一致,(没有细致的数,大概行数的是对的),如果把打开文件的异常处理去掉,以文本模式打开,会给出一个UnicodeDecodeError: 'gbk' codec can't decode byte 0x8d in position 67: illegal multibyte sequence
页:
[1]