huyanmin 发表于 2021-1-28 08:12:22

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

#递归查找文件源代码
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)

sunrise085 发表于 2021-1-28 08:54:06

你的问题是如何返回上一层,还是问为什么返回上一层?
不管你的具体问题是什么吧。给你讲一下

看上图,
我们假设第一次调用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) 就是摄政上一层路径为当前路径。

jackz007 发表于 2021-1-28 09:41:48

本帖最后由 jackz007 于 2021-1-28 09:45 编辑

def search_file(start_dir, target) :
    os.chdir(start_dir)         # 由于这一句无条件把当前目录改到了次级子目录 start_dir,在函数退出前未进行恢复                           
   
    for each_file in os.listdir(os.curdir) :
      if each_file == target :
            print(os.getcwd() + os.sep + each_file)
      if os.path.isdir(each_file) :
            search_file(each_file, target)
            os.chdir(os.pardir)# 所以,调用过search_file() 函数后,当前目录会被函数更改到子目录 each_file 中, os.pardir 属性是当前目录的父目录,执行此句代码,刚好可以恢复当前目录。
start_dir = input('请输入待查找的初始目录:')
target = input('请输入需要查找的目标文件:')
search_file(start_dir, target)

huyanmin 发表于 2021-1-28 11:46:01

你好,如果目标文件不存在或者文件夹为空,这两种情况该如何执行呢,求详解,
页: [1]
查看完整版本: python 30课习题 os.chdir(os.pardir)zhe这条语句如何返回上一层的,最好有图解