鱼C论坛

 找回密码
 立即注册
查看: 3869|回复: 1

[已解决]求指点

[复制链接]
发表于 2022-7-28 23:22:15 | 显示全部楼层 |阅读模式

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

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

x
敲了这样的代码,为什么会出错

import os
def find(a,b):
    os.chdir(a)
   
    for c in os.listdir(a):
        if c == b:
            print (os.getcwd() + os.sep + c)
        if os.path.isdir(c):
            find(c,b)
            os.chdir(os.pardir)
        
               
a = input('请输入待查找的初始目录:')
b = input('请输入待查找的文件:')
find(a,b)

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\python\试验用.py", line 15, in <module>
    find(a=x,b=y)
  File "C:\Users\Administrator\Desktop\python\试验用.py", line 9, in find
    find(c,b)
  File "C:\Users\Administrator\Desktop\python\试验用.py", line 5, in find
    for c in os.listdir(a):
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'a'


'for c in os.listdir(a): ' 中的'a'不是已经定义了吗?为什么找不到
最佳答案
2022-7-29 08:50:08
本帖最后由 jackz007 于 2022-7-29 09:48 编辑

       改变和恢复当前路径的条件不对等,导致代码逻辑存在严重缺陷
  1. import os
  2. def find(a,b):
  3.     os.chdir(a)                    # 这里无条件改变了当前路径
  4.    
  5.     for c in os.listdir(a):
  6.         if c == b:
  7.             print (os.getcwd() + os.sep + c)
  8.         if os.path.isdir(c):
  9.             find(c,b)
  10.             os.chdir(os.pardir)   # 恢复当前路径也必须是无条件的!
  11.         
  12.                
  13. a = input('请输入待查找的初始目录:')
  14. b = input('请输入待查找的文件:')
  15. find(a,b)
复制代码

        应该这么改
  1. import os
  2. def find(a,b):
  3.     r = os . getcwd()                          # 改变当前路径之前,应该先获取当前路径
  4.     os . chdir(a)                              # 改变当前路径是无条件的
  5.    
  6.     for c in os . listdir(a):
  7.         if os . path . isfile(c):              # 需要查找的应该是文件,而不是子目录
  8.             if c . lower() == b . lower():     # Windows 文件名忽略英文大小写字母     
  9.                 print (os.getcwd() + os.sep + c)
  10.         elif os . path . isdir(c):
  11.             find(c , b)
  12.     os . chdir(r)                              # 【关键】:恢复当前路径也必须是无条件的,重点在代码的缩进位置
  13.         
  14. a = input('请输入待查找的初始目录:')
  15. b = input('请输入待查找的文件:')
  16. find(a,b)
复制代码
      
        下面是我编写的代码,重点在全程使用绝对路径,不使用 os . chdir() 改变当前目录,供楼主参考:
  1. import os
  2. def find(a , b):
  3.     try:                               #  防止搜索无权限目录出错
  4.         for c in os . listdir(a):
  5.             d = os . path . join(a , c)
  6.             if os . path . isfile(d):
  7.                 if c . lower() == b . lower():
  8.                     print(d)
  9.             elif os . path . isdir(d):
  10.                 find(d , b)
  11.     except Exception as e:             #  如果搜索无权限目录异常会被这条语句捕获
  12.         print(e)

  13. a = input('请输入待查找的初始目录:') . strip()
  14. if a:
  15.     b = input('请输入待查找的文件:') . strip()
  16.     if b:
  17.         find(a , b)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-7-29 08:50:08 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-7-29 09:48 编辑

       改变和恢复当前路径的条件不对等,导致代码逻辑存在严重缺陷
  1. import os
  2. def find(a,b):
  3.     os.chdir(a)                    # 这里无条件改变了当前路径
  4.    
  5.     for c in os.listdir(a):
  6.         if c == b:
  7.             print (os.getcwd() + os.sep + c)
  8.         if os.path.isdir(c):
  9.             find(c,b)
  10.             os.chdir(os.pardir)   # 恢复当前路径也必须是无条件的!
  11.         
  12.                
  13. a = input('请输入待查找的初始目录:')
  14. b = input('请输入待查找的文件:')
  15. find(a,b)
复制代码

        应该这么改
  1. import os
  2. def find(a,b):
  3.     r = os . getcwd()                          # 改变当前路径之前,应该先获取当前路径
  4.     os . chdir(a)                              # 改变当前路径是无条件的
  5.    
  6.     for c in os . listdir(a):
  7.         if os . path . isfile(c):              # 需要查找的应该是文件,而不是子目录
  8.             if c . lower() == b . lower():     # Windows 文件名忽略英文大小写字母     
  9.                 print (os.getcwd() + os.sep + c)
  10.         elif os . path . isdir(c):
  11.             find(c , b)
  12.     os . chdir(r)                              # 【关键】:恢复当前路径也必须是无条件的,重点在代码的缩进位置
  13.         
  14. a = input('请输入待查找的初始目录:')
  15. b = input('请输入待查找的文件:')
  16. find(a,b)
复制代码
      
        下面是我编写的代码,重点在全程使用绝对路径,不使用 os . chdir() 改变当前目录,供楼主参考:
  1. import os
  2. def find(a , b):
  3.     try:                               #  防止搜索无权限目录出错
  4.         for c in os . listdir(a):
  5.             d = os . path . join(a , c)
  6.             if os . path . isfile(d):
  7.                 if c . lower() == b . lower():
  8.                     print(d)
  9.             elif os . path . isdir(d):
  10.                 find(d , b)
  11.     except Exception as e:             #  如果搜索无权限目录异常会被这条语句捕获
  12.         print(e)

  13. a = input('请输入待查找的初始目录:') . strip()
  14. if a:
  15.     b = input('请输入待查找的文件:') . strip()
  16.     if b:
  17.         find(a , b)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 16:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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