鱼C论坛

 找回密码
 立即注册
查看: 861|回复: 5

[已解决]请问这个异常是怎么回事?

[复制链接]
发表于 2018-11-9 23:40:43 | 显示全部楼层 |阅读模式

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

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

x
各路大神,下面这段代码是小甲鱼课后作业的答案:
  1. import os

  2. def search_file(start_dir, target) :
  3.     os.chdir(start_dir)
  4.    
  5.     for each_file in os.listdir(os.curdir) :
  6.         if each_file == target :
  7.             print(os.getcwd() + os.sep + each_file) # 使用os.sep是程序更标准
  8.         if os.path.isdir(each_file) :
  9.             search_file(each_file, target) # 递归调用
  10.             os.chdir(os.pardir) # 递归调用后切记返回上一层目录

  11. start_dir = input('请输入待查找的初始目录:')
  12. target = input('请输入需要查找的目标文件:')
  13. search_file(start_dir, target)
复制代码

运行后
0.png
请问这个异常是怎么回事?
最佳答案
2018-11-10 00:54:53
本帖最后由 jackz007 于 2018-11-10 12:31 编辑

      在执行程序第 4 行 chdir(start_dir) 当变量 start_dir = 'E:\System Volume Information' 的时候,发生无权访问错误,这个很正常,因为这是一个系统文件夹,用户无权访问,即使用资源管理器试图打开也会报错。

      修改方法是把有风险的指令加到 try ... except 语句块里面,这样,如果目标路径访问正常就继续,否则就略过。

  1. import os

  2. def search_file(start_dir, target) :
  3.     f = True
  4.     try :
  5.         os.chdir(start_dir)
  6.     except :
  7.         f = False
  8.     if f :
  9.         for each_file in os.listdir(os.curdir) :
  10.             if each_file == target :
  11.                 print(os.getcwd() + os.sep + each_file) # 使用os.sep是程序更标准
  12.             if os.path.isdir(each_file) :
  13.                 search_file(each_file, target) # 递归调用
  14.                 os.chdir(os.pardir) # 递归调用后切记返回上一层目录

  15. start_dir = input('请输入待查找的初始目录:')
  16. target = input('请输入需要查找的目标文件:')
  17. search_file(start_dir, target)
复制代码


      楼主的代码全程采用的是相对路径,下面给出绝对路径的版本

  1. import os

  2. def search_file(start_dir , target) :
  3.     if os.path.exists(start_dir) and os.path.isdir(start_dir) :
  4.         f = True
  5.         try :
  6.             files = os.listdir(start_dir)
  7.         except :
  8.             f = False
  9.         if f :
  10.             for each_file in files :
  11.                 path = os.path.join(start_dir , each_file)
  12.                 if each_file == target :
  13.                     print path
  14.                 if os.path.isdir(path) :
  15.                     search_file(path , target)

  16. start_dir = raw_input('请输入待查找的初始目录:')
  17. target = raw_input('请输入需要查找的目标文件:')
  18. search_file(start_dir, target)
复制代码


      此外,像遍历文件、目录这样的操作,python 设计了专用的函数 os.walk(),可以使代码更加简练,于是,楼主的作业就可以有第2个版本了:

  1. import os

  2. def search_file(start_dir, target):
  3.     for root , dirs , files in os.walk(start_dir):
  4.         for dir in dirs:
  5.             if dir == target:
  6.                 print os.path.join(root , dir)
  7.         for file in files:
  8.             if file == target:
  9.                 print os.path.join(root , file)

  10. start_dir = input('请输入待查找的初始目录:')
  11. target = input('请输入需要查找的目标文件:')
  12. search_file(start_dir, target)        
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-9 23:51:51 | 显示全部楼层
不要从根目录开始,有盘符的备份文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-10 00:54:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2018-11-10 12:31 编辑

      在执行程序第 4 行 chdir(start_dir) 当变量 start_dir = 'E:\System Volume Information' 的时候,发生无权访问错误,这个很正常,因为这是一个系统文件夹,用户无权访问,即使用资源管理器试图打开也会报错。

      修改方法是把有风险的指令加到 try ... except 语句块里面,这样,如果目标路径访问正常就继续,否则就略过。

  1. import os

  2. def search_file(start_dir, target) :
  3.     f = True
  4.     try :
  5.         os.chdir(start_dir)
  6.     except :
  7.         f = False
  8.     if f :
  9.         for each_file in os.listdir(os.curdir) :
  10.             if each_file == target :
  11.                 print(os.getcwd() + os.sep + each_file) # 使用os.sep是程序更标准
  12.             if os.path.isdir(each_file) :
  13.                 search_file(each_file, target) # 递归调用
  14.                 os.chdir(os.pardir) # 递归调用后切记返回上一层目录

  15. start_dir = input('请输入待查找的初始目录:')
  16. target = input('请输入需要查找的目标文件:')
  17. search_file(start_dir, target)
复制代码


      楼主的代码全程采用的是相对路径,下面给出绝对路径的版本

  1. import os

  2. def search_file(start_dir , target) :
  3.     if os.path.exists(start_dir) and os.path.isdir(start_dir) :
  4.         f = True
  5.         try :
  6.             files = os.listdir(start_dir)
  7.         except :
  8.             f = False
  9.         if f :
  10.             for each_file in files :
  11.                 path = os.path.join(start_dir , each_file)
  12.                 if each_file == target :
  13.                     print path
  14.                 if os.path.isdir(path) :
  15.                     search_file(path , target)

  16. start_dir = raw_input('请输入待查找的初始目录:')
  17. target = raw_input('请输入需要查找的目标文件:')
  18. search_file(start_dir, target)
复制代码


      此外,像遍历文件、目录这样的操作,python 设计了专用的函数 os.walk(),可以使代码更加简练,于是,楼主的作业就可以有第2个版本了:

  1. import os

  2. def search_file(start_dir, target):
  3.     for root , dirs , files in os.walk(start_dir):
  4.         for dir in dirs:
  5.             if dir == target:
  6.                 print os.path.join(root , dir)
  7.         for file in files:
  8.             if file == target:
  9.                 print os.path.join(root , file)

  10. start_dir = input('请输入待查找的初始目录:')
  11. target = input('请输入需要查找的目标文件:')
  12. search_file(start_dir, target)        
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-10 23:07:33 | 显示全部楼层
jackz007 发表于 2018-11-10 00:54
在执行程序第 4 行 chdir(start_dir) 当变量 start_dir = 'E:\System Volume Information' 的时候, ...

可为什么我用下面这种(我自己敲的)就可以,用递归就不行?
  1. '''查找目标文件'''
  2. import os

  3. origin_dir = input('请输入待查找的初始目录:')
  4. target_file = input('请输入需要查找的目标文件:')

  5. def search(origin_dir,target_file):
  6.     result = list()
  7.     for each in os.walk(origin_dir):
  8.         if target_file in each[2]:
  9.             target_path = os.path.join(each[0],target_file)
  10.             result.append(target_path)
  11.     return result

  12. result = search(origin_dir,target_file)
  13. if result:
  14.     for each in result:
  15.         print(each)
  16. else:
  17.     print('查找的文件不存在!')
  18.    


复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-11 09:14:53 | 显示全部楼层
过来顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-20 23:04:20 | 显示全部楼层
jackz007 发表于 2018-11-10 00:54
在执行程序第 4 行 chdir(start_dir) 当变量 start_dir = 'E:\System Volume Information' 的时候, ...

实在不好意思,一直忘了设最佳答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 10:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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