Peteryo01223 发表于 2021-1-25 15:57:45

第30课:第2题

本帖最后由 Peteryo01223 于 2021-1-25 16:15 编辑

原题:
编写一个程序,用户输入文件名以及开始搜索的路径,搜索该文件是否存在。如遇到文件夹,则进入文件夹继续搜索,程序实现如图(此处,图省略):

看了参考答案后,我的抄写:
import os

def function1(path, target):
    os.chdir(path)

    for each in os.listdir(os.curdir):
      if each == target:
            print(os.getcwd() + os.sep + each) # 使用os.sep,能够让程序更标准
      if os.path.isdir(each):
            function1(each, target) # 递归调用
            os.chdir(os.pardir) # 递归调用后切记返回上一层目录

path = input('请输入待查找的原始目录:')
target = input('请输入需要查找的目标文件:')
function1(path, target)
报错如下:
================== RESTART: C:/Users/user/Desktop/20210125c.py =================
请输入待查找的原始目录:e:\\
请输入需要查找的目标文件:DiasSetup
Traceback (most recent call last):
File "C:/Users/user/Desktop/20210125c.py", line 15, in <module>
    function1(path, target)
File "C:/Users/user/Desktop/20210125c.py", line 10, in function1
    function1(each, target) # 递归调用
File "C:/Users/user/Desktop/20210125c.py", line 10, in function1
    function1(each, target) # 递归调用
File "C:/Users/user/Desktop/20210125c.py", line 4, in function1
    os.chdir(path)
PermissionError: 拒绝访问。: 'S-1-5-21-1246152009-554298428-845477721-1001'
>>>
问题:
1. 为何报错?怎么改呢?
2. 递归调用后,为何要切记返回上一层目录?我猜是为了防止死循环,但是具体什么意思,我不理解。
3. 我把输入的目录,改为 E:/7层佳能-3245/UFRII_Driver_V1402_W64_ZH_04/misc,查找的目标文件还是:DiasSetup,为何运行不报错,但无输出结果呢?如下:
================== RESTART: C:/Users/user/Desktop/20210125c.py =================
请输入待查找的原始目录:E:/7层佳能-3245/UFRII_Driver_V1402_W64_ZH_04/misc
请输入需要查找的目标文件:DiasSetup
>>>

jackz007 发表于 2021-1-25 16:28:40

本帖最后由 jackz007 于 2021-1-25 17:00 编辑

       错误的原因是访问了无权访问的文件夹,需要为代码添加容错功能,确保发生这种问题的时候,代码还能继续执行,不会直接退出。
       代码做了一定的改动,把逐级进入子目录工作改为全程绝对路径工作,不改变当前目录。
def function1(path , target):
    try:
      for each in os . listdir(path):                  # 风险语句,存在权限问题时,执行这一句会出错
            x = os . path . join(path , each)            # 执行到这里,说明本目录的访问风险已过
            if os . path . isfile(x) :
                if each . lower() == target . lower() :
                  print(x)
            elif os . path . isdir(x):
                function1(x , target)
    except Exception as e:                              # 风险语句出现问题会直接跳到这里继续
      print("*** Error :" , path)
      print(e)
    至于为什么递归结束要返回上一级目录,那是因为在 function1() 的入口就把当前目录改到了下一级子目录,而在函数的出口,并没有进行相应的恢复,从而导致递归结束后,当前路径会非预期地改变到下一级子目录,必须专门进行恢复,如果不恢复,后续 os . listdir()列出的文件、子目录就会脱离所在目录环境,所有针对文件、子目录的判断、递归都会失败。

Peteryo01223 发表于 2021-1-25 16:55:49

jackz007 发表于 2021-1-25 16:28
错误的原因是访问了无权访问的文件夹,需要为代码添加容错功能,确保发生这种问题的时候,代码还能 ...

强人!运行成功。我慢慢消化一下。

Peteryo01223 发表于 2021-1-25 16:57:08

{:10_249:}"最佳答案"绿色按钮,怎么找不到了?想给高手最佳。
页: [1]
查看完整版本: 第30课:第2题