鱼C论坛

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

[已解决]为什么递归调用后要返回上层目录呢?

[复制链接]
发表于 2017-7-16 12:42:44 | 显示全部楼层 |阅读模式

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

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

x
  1. import os

  2. def search_file(start_dir, target):
  3.     os.chdir(start_dir)       # 改变工作目录

  4.     for each_file in os.listdir(os.curdir):      
  5.         if each_file == target:
  6.             print(os.getcwd() + os.sep + each_file) # 使用os.sep使程序更标准(输出操作系统特定的路径分隔符)
  7.         if os.path.isdir(each_file):
  8.             search_file(each_file, target) # 递归调用
  9.             os.chdir(os.pardir) # 递归调用后切记返回上一层目录

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



这个是第三十讲的作业= =查不到解释。。。不过都附着有这么一句话

知道是对的= =。。但解释不清楚。。

删除这一行,出现的是这个

D:\System Volume Information\TEST.txt

跟我预想的。。也不一样。。为啥会出来系统卷标信息的。。。

最佳答案
2017-7-16 14:14:37
一般盘下面都个有个System Volume Information无法访问的文件夹。要么获得权限删除;要么在代码中排除。
2017-07-16_141051.png

提供个简单的办法:
  1. import os

  2. def search_file(start_dir, target):
  3.     if start_dir == "System Volume Information":
  4.         return
  5.     os.chdir(start_dir)       # 改变工作目录
  6.     for each_file in os.listdir(os.curdir):      
  7.         if each_file == target:
  8.             print(os.getcwd() + os.sep + each_file) # 使用os.sep使程序更标准(输出操作系统特定的路径分隔符)
  9.         if os.path.isdir(each_file):
  10.             search_file(each_file, target) # 递归调用
  11.             os.chdir(os.pardir) # 递归调用后切记返回上一层目录

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

使用道具 举报

发表于 2017-7-16 14:14:37 | 显示全部楼层    本楼为最佳答案   
一般盘下面都个有个System Volume Information无法访问的文件夹。要么获得权限删除;要么在代码中排除。
2017-07-16_141051.png

提供个简单的办法:
  1. import os

  2. def search_file(start_dir, target):
  3.     if start_dir == "System Volume Information":
  4.         return
  5.     os.chdir(start_dir)       # 改变工作目录
  6.     for each_file in os.listdir(os.curdir):      
  7.         if each_file == target:
  8.             print(os.getcwd() + os.sep + each_file) # 使用os.sep使程序更标准(输出操作系统特定的路径分隔符)
  9.         if os.path.isdir(each_file):
  10.             search_file(each_file, target) # 递归调用
  11.             os.chdir(os.pardir) # 递归调用后切记返回上一层目录

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

使用道具 举报

发表于 2017-7-16 18:00:49 | 显示全部楼层
通过异常处理的代码:
  1. import os

  2. def search_file(start_dir, target):
  3.     try:
  4.         os.chdir(start_dir)       # 改变工作目录
  5.     except PermissionError as reason:
  6.         print(start_dir + str(reason))
  7.         return
  8.     for each_file in os.listdir(os.curdir):      
  9.         if each_file == target:
  10.             print(os.getcwd() + os.sep + each_file) # 使用os.sep使程序更标准(输出操作系统特定的路径分隔符)
  11.         if os.path.isdir(each_file):
  12.             search_file(each_file, target) # 递归调用
  13.             os.chdir(os.pardir) # 递归调用后切记返回上一层目录

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

使用道具 举报

 楼主| 发表于 2017-7-18 00:28:08 | 显示全部楼层
ba21 发表于 2017-7-16 14:14
一般盘下面都个有个System Volume Information无法访问的文件夹。要么获得权限删除;要么在代码中排除。

...

改成这个以后= =。。返回的是我。。第一个文件夹  .android_secure

不过。。想问的其实是。。如果递归调用不返回上层目录的话。。。是会一直下探一个停不下来吗。。那么。。隐藏的那个空的是第一个。。探到不能探。。。返回这个值。。。加上这个代码跳过去后。。这个.android是第二个。。也停不下来。。所以也返回这个值。。。

不是像使用返回上层目录后,逐个搜索那样。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-18 08:48:20 | 显示全部楼层
返回上层目录  意思就是递归的返回。有去有回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-30 13:42:06 | 显示全部楼层
四月的岩岩 发表于 2017-7-18 00:28
改成这个以后= =。。返回的是我。。第一个文件夹  .android_secure

不过。。想问的其实是。。如果递归 ...

如果只是要求返回,这样是不是也可以呢?
  1. import os
  2. import sys
  3. sys.setrecursionlimit(4000)
  4. def search_faile(path_file, file_name):
  5.     try:
  6.         #os.chdir(path_faile)
  7.        all_file = os.listdir(path_file)
  8.     except IOError:
  9.         print("Error: 读取文件夹 %s 失败,权限不够" %(path_file))
  10.     else:
  11.         for i in all_file:
  12.             if os.path.isdir(path_file + os.sep + i):
  13.                 search_faile(path_file + os.sep + i, file_name)
  14.                 #os.chdir(os.pardir)
  15.             elif i == file_name:
  16.                 print(path_file+os.sep+i)
  17.             else:
  18.                  None

  19. #path_faile = input('请输入待查找的初始目录:')
  20. path_faile = "C:\"
  21. #fiale_name = input('请输入需要查找的目标文件名:')
  22. fiale_name = 'test.txt'
  23. search_faile(path_faile,fiale_name)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 06:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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