马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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) # 递归调用后切记返回上一层目录
start_dir = input('请输入待查找的初始目录:')
target = input('请输入需要查找的目标文件:')
search_file(start_dir, target)
问题1:里面用到了递归,递归都是要有返回条件的,这里面的返回条件是什么?
问题2:如果each_file是文件夹的话,会开始递归调用,并且os.chdir(os.pardir)返回上级目录,如果进入到一个文件后,里面全是文件,没有文件夹,并且没有要找的文件,那么就不调用os.chdir(os.pardir)返回上级目录了么?#因为os.chdir(os.pardir)是 if os.path.isdir(each_file)条件下的语句#如果这样怎么接下来的循环遍历呢?
问题一、程序的第6~11行是for循环,循环结束后就返回了,这就是递归的返回啊
比如,第一次调用search_file,早for循环中进入的第二个if,在第10行递归调用;
第二次调用search_file,又一次进入for循环,循环结束后,就返回到调用的地方了,即上面的第10行。
问题二、你的提问前后是矛盾的哟~~若是一个文件夹中都是文件,那么这就是最底层文件夹了,遍历完就完了,不会再遍历了啊。
这个可能有点不太好理解,需要自己多琢磨。
举个小例子,你要查找的目录(我们称之为目录A)下有三个文件夹,四个文件,第一次查找,进入for之后,先看到两个文件(都是执行的第7行的if),都不是要找的文件,然后遇到一个文件夹(执行第9行的if),进入这个文件夹(执行的是第10行,我们称之为目录B),第二次递归调用,这个文件夹中只有5个文件,遍历完这个文件夹中的五个文件之后,第二次递归结束,返回到第二次调用的位置,即第10行,继续执行第11行,返回上一层文件夹(即目录A),这时候继续遍历目录A,因为还有一个文件夹和两个文件没有遍历呢……
只能说这么多了。不知道你能否理解。自己看着程序,在纸上画一画,或许就理解了
|