兔兔熊 发表于 2020-5-8 14:15:26

30文件系统 第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)



关于这道题的第10行代码 search_file(each_file, target) #递归调用
each_file 不是只是一个字符串么 比如 ‘新建文件夹1号’ 这种样子
运行os.chdir(start_dir) 为什么不会报错说找不到呢?我试了一下在外部运行os.chdir(‘新建文件夹’)会显示找不到地方

txxcat 发表于 2020-5-8 14:15:27

已经os.chdir(start_dir),当前目录已经是工作目录了,在工作目录下直接os.chdir(仅目录名)是正常操作,不需要完整路径,举例来说:你要查找的目录是D:\dir1,下面有一个subdir的子目录,代码首先运行os.chdir('D:\dir1'),当前目录转为D:\dir1,os.dir遍历时发现了subdir是个目录,递归运行了search_file('subdir', target),那么下一步就运行了
os.chdir('subdir')进入了subdir子目录进行下一步的操作,因为subdir就在dir1下面,所以无需'D:\dir1\subdir',只用目录名'subdir'就可以了。

txxcat 发表于 2020-5-8 14:51:54

首先说os.chdir(start_dir),start_dir是由你输入的路径名,你输入正确,当然就不会报错,输错了就会报错,注意最好输入完整的路径,包括盘符。
search_file(each_file, target),这里的each_file是os.listdir(os.curdir)找出的当前目录下所有文件和目录名,名字肯定是个字符串,然后由 os.path.isdir(each_file)判断如果是目录名就递归到目录下继续查找。

兔兔熊 发表于 2020-5-8 16:27:41

txxcat 发表于 2020-5-8 14:51
首先说os.chdir(start_dir),start_dir是由你输入的路径名,你输入正确,当然就不会报错,输错了就会报错, ...

名字(each_file) 只是字符串而不是完整路径名称的话,os.chdir(each_file) (code第三行start_dir就被设置成了each_file对吧?) 不就会报错了么,为什么在这个code里不会报错呢?

兔兔熊 发表于 2020-5-9 03:56:41

txxcat 发表于 2020-5-8 14:51
首先说os.chdir(start_dir),start_dir是由你输入的路径名,你输入正确,当然就不会报错,输错了就会报错, ...

明白了!非常感谢!
页: [1]
查看完整版本: 30文件系统 第2题