Big-Man 发表于 2019-9-8 10:17:55

一定要有os.chdir吗,start-dir不就是初始目录了吗

import os                                                                                                                                          

def search_file(start_dir, target) :
    os.chdir(start_dir)     #为什么这句一定要有?
   
    for each_file in os.listdir(os.curdir) :   # 我直接 for each_file in os.listdir(start_dir)
      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-9-8 10:30:25

感觉你说的没有问题

ps:为什么不用 os.walk?

Big-Man 发表于 2019-9-8 10:36:22

永恒的蓝色梦想 发表于 2019-9-8 10:30
感觉你说的没有问题

ps:为什么不用 os.walk?

因为视频里还没学到{:5_97:}
但是os.chdir(start_dir)没有这句
把for each_file in os.listdir(os.curdir)改为for each_file in os.listdir(start_dir)找不到目标文件

jackz007 发表于 2019-9-8 11:05:28

本帖最后由 jackz007 于 2019-9-8 11:08 编辑

       楼主的理解没错,小甲鱼的代码版本使用的是相对路径,每搜索一个新路径之前,必须要用 chdir() 函数把这个路径变成当前路径,搜索完后,还得退回原始路径,确实比较麻烦。如果全程采用绝对路径,代码就会简洁许多:
import os
def search_file(start_dir, target) :
    for each_file in os . listdir(start_dir) :
      path = os . path . join(start_dir , each_file)
      if os . path . isfile(path):
            if each_file == target :
                print(path)
      elif os . path . isdir(path) :
            search_file(path , target) # 递归调用

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

      

Big-Man 发表于 2019-9-8 11:17:34

jackz007 发表于 2019-9-8 11:05
楼主的理解没错,小甲鱼的代码版本使用的是相对路径,每搜索一个新路径之前,必须要用 chdir() 函数 ...

但是我只在小甲鱼代码的基础上把 os.chdir(start_dir)去掉,然后os.listdir(os.curdir)改为uos.listdir(start_dir)并不能搜索到目标文件。你的代码最后返回上一层目录也还是需要的吧import os
def search_file(start_dir, target):
   
    for each_file in os.listdir(start_dir):
      if each_file == target:
            print(start_dir + os.sep + each_file)
      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)

jackz007 发表于 2019-9-8 11:28:00

本帖最后由 jackz007 于 2019-9-8 11:29 编辑

Big-Man 发表于 2019-9-8 11:17
但是我只在小甲鱼代码的基础上把 os.chdir(start_dir)去掉,然后os.listdir(os.curdir)改为uos.listdir(s ...

    我的代码你试过吗,这个代码始终没有进入过任何路径,何来返回上级目录的说法?

Big-Man 发表于 2019-9-8 12:45:09

jackz007 发表于 2019-9-8 11:28
我的代码你试过吗,这个代码始终没有进入过任何路径,何来返回上级目录的说法?

我明白了,你的代码执行for循环的是path 并不是each_file本身,所以不用返回上层目录
但是我搞不懂吧在小甲鱼代码的基础上改为什么运行的时候没有结果输出呢?
刚开始学,有点难理解,谢谢谢谢

jackz007 发表于 2019-9-8 13:26:52

本帖最后由 jackz007 于 2019-9-8 13:29 编辑

Big-Man 发表于 2019-9-8 12:45
我明白了,你的代码执行for循环的是path 并不是each_file本身,所以不用返回上层目录
但是我搞不懂吧在 ...

      因为小甲鱼的代码使用相对路径,搜索一个目录前,必须把这个目录变成当前路径,才能搜索到文件,所以,代码中的 2 个 os . chdir() 函数必须成对存在,缺一不可!

ykn大神6 发表于 2019-9-8 13:41:38

用os.walk()

Big-Man 发表于 2019-9-8 16:40:56

jackz007 发表于 2019-9-8 13:26
因为小甲鱼的代码使用相对路径,搜索一个目录前,必须把这个目录变成当前路径,才能搜索到文件, ...

搞明白了,谢谢谢谢{:5_106:}

muxuehan9201 发表于 2021-12-3 21:17:17

jackz007 发表于 2021-12-3 22:13:06

本帖最后由 jackz007 于 2021-12-3 22:18 编辑

muxuehan9201 发表于 2021-12-3 21:17
好兄弟求助!!这个递归问题困扰我很久了 一直没想通 小甲鱼这个相对路径用os.chdir我能理解,但是递归之 ...

      因为只要递归调用 search_file(each_file, target) ,在函数内,当前目录就会进入次级子目录 each_file,本来应该在函数退出前,恢复原本当前目录的,可是,这个环节在函数中缺失了。导致函数调用过后,当前目录仍旧留在次级子目录 each_file 内,所以,才需要用 cd 到父目录的方法来专门恢复当前目录。

muxuehan9201 发表于 2021-12-3 22:16:07

muxuehan9201 发表于 2021-12-3 22:50:38

页: [1]
查看完整版本: 一定要有os.chdir吗,start-dir不就是初始目录了吗