qin_yin 发表于 2020-10-12 23:15:56

递归深度

题目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:55:45

本帖最后由 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是有返回值的,但是递归的时候,你却没管返回值,我没有详细看,你自己检查一下

qin_yin 发表于 2020-10-13 11:21:50

sunrise085 发表于 2020-10-13 09:55
你的程序问题在于Search_file函数的参数path你并没有用到,这就导致递归的时候传进去的子路径并没有被检索 ...

请问下,二进制模式读取,和文本模式读取有什么区别,我用小甲鱼的代码,和我自己写的都会出现一个错误,用文本模式打开,记录的行数与实际行数不一样,用二进制打开记录的行数基本与实际一致,(没有细致的数,大概行数的是对的),如果把打开文件的异常处理去掉,以文本模式打开,会给出一个UnicodeDecodeError: 'gbk' codec can't decode byte 0x8d in position 67: illegal multibyte sequence
页: [1]
查看完整版本: 递归深度