第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 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()列出的文件、子目录就会脱离所在目录环境,所有针对文件、子目录的判断、递归都会失败。 jackz007 发表于 2021-1-25 16:28
错误的原因是访问了无权访问的文件夹,需要为代码添加容错功能,确保发生这种问题的时候,代码还能 ...
强人!运行成功。我慢慢消化一下。 {:10_249:}"最佳答案"绿色按钮,怎么找不到了?想给高手最佳。
页:
[1]