鱼C论坛

 找回密码
 立即注册
查看: 1545|回复: 8

[已解决]关于[课后作业] 第030讲:文件系统:介绍一个高大上的东西 | 课后测试题及答案

[复制链接]
发表于 2019-12-23 15:53:01 | 显示全部楼层 |阅读模式

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

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

x
第030讲:文件系统:介绍一个高大上的东西

其中课后作业第2题:2. 编写一个程序,用户输入文件名以及开始搜索的路径,搜索该文件是否存在。如遇到文件夹,则进入文件夹继续搜索。

答案给出的代码:
import os

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

start_dir = input('请输入待查找的初始目录:')
target = input('请输入需要查找的目标文件:')
search_file(start_dir, target)

其中红字部分我不太理解为什么一定要返回上一层目录,我去掉红字部分运行时电脑也没有卡主或者出现程序一直运行不会关闭的情况。

求助各位大佬究竟红字部分有何影响?
最佳答案
2019-12-23 20:33:43
进入了一个子目录,在遍历完后就必须返回上一层目录,否则程序就会陷在子目录里出不来。

你去掉红字部分没有报错可能是因为你指定的查找目录没有子文件夹。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-23 17:24:24 | 显示全部楼层
      这个代码采用相对路径方式工作,就是说,搜索一个子目录前,必须先把这个目录变成当前目录,然后,直接用 os . listdir() 获取到的文件名、子目录名就可以对文件和子目录的属性进行查询和判断,假如这个期间改变了当前路径,那么,后续所有文件、目录信息的查询和判断都无法进行。
  1. def search_file(start_dir, target) :
  2.     os.chdir(start_dir)
  3. . . . . . .
  4.             search_file(each_file, target)
  5.             os.chdir(os.pardir)
复制代码

      递归函数在入口直接修改了程序的当前路径,这就意味着调用递归函数后,当前路径会被切换到才搜索过的下级子目录,而语句 os.chdir(os.pardir)  恰好让程序返回上级父目录,这样,程序运行环境才能得以恢复。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-23 20:33:43 | 显示全部楼层    本楼为最佳答案   
进入了一个子目录,在遍历完后就必须返回上一层目录,否则程序就会陷在子目录里出不来。

你去掉红字部分没有报错可能是因为你指定的查找目录没有子文件夹。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-24 08:55:18 | 显示全部楼层
jackz007 发表于 2019-12-23 17:24
这个代码采用相对路径方式工作,就是说,搜索一个子目录前,必须先把这个目录变成当前目录,然后,直 ...

哦哦,有点懂了,就是说如果子目录存在文件夹那就会进入这个文件夹进行搜索,但是之后程序就结束了,最开始的目录剩下的文件就无法搜索了是吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-24 08:58:54 | 显示全部楼层
zltzlt 发表于 2019-12-23 20:33
进入了一个子目录,在遍历完后就必须返回上一层目录,否则程序就会陷在子目录里出不来。

你去掉红字部分 ...

懂了懂了,就是子目录如果有文件夹那么文件夹外面的文件就有可能遍历不到对吧?因为要是先进入了文件夹就出不来了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-24 20:16:57 | 显示全部楼层
jjfjj1211 发表于 2019-12-24 08:58
懂了懂了,就是子目录如果有文件夹那么文件夹外面的文件就有可能遍历不到对吧?因为要是先进入了文件夹就 ...

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

使用道具 举报

发表于 2020-2-25 10:22:36 | 显示全部楼层
jackz007 发表于 2019-12-23 17:24
这个代码采用相对路径方式工作,就是说,搜索一个子目录前,必须先把这个目录变成当前目录,然后,直 ...

大佬你好!请问search_file(each_file, target) 这里的递归是一开始就os.chdir(os.pardir)返回父目录还是执行完递归入口的os.chdir(each_file)后再返回父目录?新人不太明白,望指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-25 11:45:14 | 显示全部楼层
本帖最后由 jackz007 于 2020-2-25 11:46 编辑
好好学不玩手机 发表于 2020-2-25 10:22
大佬你好!请问search_file(each_file, target) 这里的递归是一开始就os.chdir(os.pardir)返回父目录还是 ...


  1. import os

  2. def search_file(start_dir, target) :
  3.     cwd = os . getcwd()                             # 添加此句,先保存当前路径
  4.     os . chdir(start_dir)                           # 改变当前路径
  5.    
  6.     for each_file in os.listdir(os.curdir) :
  7.         if each_file == target :
  8.             print(os.getcwd() + os.sep + each_file)
  9.         if os.path.isdir(each_file) :
  10.             search_file(each_file, target)
  11.             # os.chdir(os.pardir)                   # 函数 search_file() 不再改变当前路径,所以,必须删除这一句
  12.     os . chdir(cwd)                                 # 添加此句,退出函数前,再恢复当前路径

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

使用道具 举报

发表于 2020-2-25 12:23:32 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-8 12:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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