鱼C论坛

 找回密码
 立即注册
查看: 2534|回复: 3

[萌新报道] 第30课:第2题

[复制链接]
发表于 2021-1-25 15:57:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

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

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

  10. path = input('请输入待查找的原始目录:')
  11. target = input('请输入需要查找的目标文件:')
  12. function1(path, target)
复制代码

报错如下:
  1. ================== RESTART: C:/Users/user/Desktop/20210125c.py =================
  2. 请输入待查找的原始目录:e:\\
  3. 请输入需要查找的目标文件:DiasSetup
  4. Traceback (most recent call last):
  5.   File "C:/Users/user/Desktop/20210125c.py", line 15, in <module>
  6.     function1(path, target)
  7.   File "C:/Users/user/Desktop/20210125c.py", line 10, in function1
  8.     function1(each, target) # 递归调用
  9.   File "C:/Users/user/Desktop/20210125c.py", line 10, in function1
  10.     function1(each, target) # 递归调用
  11.   File "C:/Users/user/Desktop/20210125c.py", line 4, in function1
  12.     os.chdir(path)
  13. PermissionError: [WinError 5] 拒绝访问。: 'S-1-5-21-1246152009-554298428-845477721-1001'
  14. >>>
复制代码

问题:
1. 为何报错?怎么改呢?
2. 递归调用后,为何要切记返回上一层目录?我猜是为了防止死循环,但是具体什么意思,我不理解。
3. 我把输入的目录,改为 E:/7层佳能-3245/UFRII_Driver_V1402_W64_ZH_04/misc,查找的目标文件还是:DiasSetup,为何运行不报错,但无输出结果呢?如下:
  1. ================== RESTART: C:/Users/user/Desktop/20210125c.py =================
  2. 请输入待查找的原始目录:E:/7层佳能-3245/UFRII_Driver_V1402_W64_ZH_04/misc
  3. 请输入需要查找的目标文件:DiasSetup
  4. >>>
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-25 16:28:40 | 显示全部楼层
本帖最后由 jackz007 于 2021-1-25 17:00 编辑

       错误的原因是访问了无权访问的文件夹,需要为代码添加容错功能,确保发生这种问题的时候,代码还能继续执行,不会直接退出。
       代码做了一定的改动,把逐级进入子目录工作改为全程绝对路径工作,不改变当前目录。
  1. def function1(path , target):
  2.     try:
  3.         for each in os . listdir(path):                    # 风险语句,存在权限问题时,执行这一句会出错
  4.             x = os . path . join(path , each)              # 执行到这里,说明本目录的访问风险已过
  5.             if os . path . isfile(x) :
  6.                 if each . lower() == target . lower() :
  7.                     print(x)
  8.             elif os . path . isdir(x):
  9.                 function1(x , target)
  10.     except Exception as e:                                # 风险语句出现问题会直接跳到这里继续
  11.         print("*** Error :" , path)
  12.         print(e)
复制代码

    至于为什么递归结束要返回上一级目录,那是因为在 function1() 的入口就把当前目录改到了下一级子目录,而在函数的出口,并没有进行相应的恢复,从而导致递归结束后,当前路径会非预期地改变到下一级子目录,必须专门进行恢复,如果不恢复,后续 os . listdir()  列出的文件、子目录就会脱离所在目录环境,所有针对文件、子目录的判断、递归都会失败。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
Peteryo01223 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

强人!运行成功。我慢慢消化一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-25 16:57:08 | 显示全部楼层
"最佳答案"绿色按钮,怎么找不到了?想给高手最佳。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 16:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表