鱼C论坛

 找回密码
 立即注册
查看: 2251|回复: 3

[已解决]python 30课习题 os.chdir(os.pardir)zhe这条语句如何返回上一层的,最好有图解

[复制链接]
发表于 2021-1-28 08:12:22 | 显示全部楼层 |阅读模式

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

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

x
#递归查找文件源代码
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) # 递归调用后切记返回上一层目录             # os.chdir(os.pardir) 这条语句如何返回上一层的
start_dir = input('请输入待查找的初始目录:')
target = input('请输入需要查找的目标文件:')
search_file(start_dir, target)
最佳答案
2021-1-28 08:54:06
你的问题是如何返回上一层,还是问为什么返回上一层?
不管你的具体问题是什么吧。给你讲一下
360截图20210128083711924.jpg
看上图,
我们假设第一次调用search_file方法的时候start_dir路径为D:\\test
进入search_file后,第一行通过os.chdir,设置当前目录为 D:\\test
进入for循环后,遍历该目录下的文件/文件夹,先遇到两个文件(A.txt和B.py),这两次循环都不会进入第二个if,因为他们不是文件夹
第三次循环的时候,遇到的是C文件夹,会进入第二个if,第二次调用search_file,此时start_dir为D:\\test\\C文件夹
      进入search_file后,第一行通过os.chdir,设置当前目录为 D:\\test\\C文件夹
      进入for循环后,遍历该目录下的文件/文件夹,先后遇到两个文件,分别是AA.py和BB.docx,没有遇到文件夹,不会进入到第二个if,不会再次递归调用search_file
      遍历完这两个文件后,for循环结束,第二次调用search_file结束,返回到调用search_file的位置
返回到第一次调用search_file 的时候的第二个if中,此时当前路径仍然是 D:\\test\\C文件夹
继续执行下一行,os.chdir(os.pardir) 将当前路径修改为上一层,即 D:\\test
继续遍历当前路径下的其他文件/文件夹,第四次循环遇到D.obj文件,不会进入第二个if
第五次循环的时候,遇到的是E文件夹,会进入第二个if……


注意以上解释的缩进,有缩进的是第二次调用search_file

若你要问的是如何返回上一层,那么就简单了,os.chdir作用就是设置当前路径,os.pardir则是上一层路径,所以 os.chdir(os.pardir) 就是摄政上一层路径为当前路径。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-28 08:54:06 | 显示全部楼层    本楼为最佳答案   
你的问题是如何返回上一层,还是问为什么返回上一层?
不管你的具体问题是什么吧。给你讲一下
360截图20210128083711924.jpg
看上图,
我们假设第一次调用search_file方法的时候start_dir路径为D:\\test
进入search_file后,第一行通过os.chdir,设置当前目录为 D:\\test
进入for循环后,遍历该目录下的文件/文件夹,先遇到两个文件(A.txt和B.py),这两次循环都不会进入第二个if,因为他们不是文件夹
第三次循环的时候,遇到的是C文件夹,会进入第二个if,第二次调用search_file,此时start_dir为D:\\test\\C文件夹
      进入search_file后,第一行通过os.chdir,设置当前目录为 D:\\test\\C文件夹
      进入for循环后,遍历该目录下的文件/文件夹,先后遇到两个文件,分别是AA.py和BB.docx,没有遇到文件夹,不会进入到第二个if,不会再次递归调用search_file
      遍历完这两个文件后,for循环结束,第二次调用search_file结束,返回到调用search_file的位置
返回到第一次调用search_file 的时候的第二个if中,此时当前路径仍然是 D:\\test\\C文件夹
继续执行下一行,os.chdir(os.pardir) 将当前路径修改为上一层,即 D:\\test
继续遍历当前路径下的其他文件/文件夹,第四次循环遇到D.obj文件,不会进入第二个if
第五次循环的时候,遇到的是E文件夹,会进入第二个if……


注意以上解释的缩进,有缩进的是第二次调用search_file

若你要问的是如何返回上一层,那么就简单了,os.chdir作用就是设置当前路径,os.pardir则是上一层路径,所以 os.chdir(os.pardir) 就是摄政上一层路径为当前路径。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-1-28 09:41:48 | 显示全部楼层
本帖最后由 jackz007 于 2021-1-28 09:45 编辑
  1. def search_file(start_dir, target) :
  2.     os.chdir(start_dir)           # 由于这一句无条件把当前目录改到了次级子目录 start_dir,在函数退出前未进行恢复                           
  3.    
  4.     for each_file in os.listdir(os.curdir) :
  5.         if each_file == target :
  6.             print(os.getcwd() + os.sep + each_file)
  7.         if os.path.isdir(each_file) :
  8.             search_file(each_file, target)
  9.             os.chdir(os.pardir)  # 所以,调用过  search_file() 函数后,当前目录会被函数更改到子目录 each_file 中, os.pardir 属性是当前目录的父目录,执行此句代码,刚好可以恢复当前目录。
  10. start_dir = input('请输入待查找的初始目录:')
  11. target = input('请输入需要查找的目标文件:')
  12. search_file(start_dir, target)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-1-28 11:46:01 | 显示全部楼层
你好,如果目标文件不存在或者文件夹为空,这两种情况该如何执行呢,求详解,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 19:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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