鱼C论坛

 找回密码
 立即注册
查看: 1623|回复: 13

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

[复制链接]
发表于 2019-9-8 10:17:55 | 显示全部楼层 |阅读模式

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

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

x
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 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)
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-8 10:30:25 | 显示全部楼层
感觉你说的没有问题

ps:为什么不用 os.walk?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-8 10:36:22 | 显示全部楼层
永恒的蓝色梦想 发表于 2019-9-8 10:30
感觉你说的没有问题

ps:为什么不用 os.walk?

因为视频里还没学到
但是os.chdir(start_dir)没有这句
把for each_file in os.listdir(os.curdir)改为for each_file in os.listdir(start_dir)找不到目标文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 ...


    我的代码你试过吗,这个代码始终没有进入过任何路径,何来返回上级目录的说法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-8 12:45:09 | 显示全部楼层
jackz007 发表于 2019-9-8 11:28
我的代码你试过吗,这个代码始终没有进入过任何路径,何来返回上级目录的说法?

我明白了,你的代码执行for循环的是path 并不是each_file本身,所以不用返回上层目录
但是我搞不懂吧在小甲鱼代码的基础上改为什么运行的时候没有结果输出呢?
刚开始学,有点难理解,谢谢谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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() 函数必须成对存在,缺一不可!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-8 13:41:38 | 显示全部楼层
用os.walk()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

搞明白了,谢谢谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2021-12-3 21:17:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 到父目录的方法来专门恢复当前目录。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2021-12-3 22:16:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2021-12-3 22:50:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 18:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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