鱼C论坛

 找回密码
 立即注册
查看: 2010|回复: 4

【已解决】30讲课后作业第二题这个问题,求大佬指点

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

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

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

x
本帖最后由 chordblue 于 2019-8-5 12:52 编辑

我的源代码如下:
  1. def file_match(directory,filename):  
  2.     os.chdir(directory+'\\')  #这里如果不加'\\'或os.sep,输入目录为d:则修改无效
  3.     for each in os.listdir(os.curdir):
  4.         if os.path.isfile(each):
  5.             if each == filename:
  6.                 result.append(directory+'\\'+filename)   
  7.         else:
  8.             file_match(directory+'\\'+each,filename)
复制代码


主函数里针对输入路径做了检查,并定义了result空列表来接收查询到的结果,如果没有结果则显示未查找到结果,为方便阅读这里就不贴出来了。
我的问题是在这个定义的函数里,正常我输入类似d:\\test这种路径来查询,结果都正确显示了,如果我把查询路径修改到上一级d:,就报错了:
  1. Traceback (most recent call last):
  2.   File "D:\Program Files\Python37-32\exercise\exercise_030_02.py", line 28, in <module>
  3.     file_match(directory,filename)
  4.   File "D:\Program Files\Python37-32\exercise\exercise_030_02.py", line 12, in file_match
  5.     file_match(directory+'\\'+each,filename)
  6.   File "D:\Program Files\Python37-32\exercise\exercise_030_02.py", line 5, in file_match
  7.     os.chdir(directory+os.sep)
  8. NotADirectoryError: [WinError 267] 目录名称无效。: '[color=Red]d:\\1.txt\\[/color]'
复制代码


我寻思着递归不应该会传入"d:\\1.txt\\"这种路径作为第一个参数值啊,毕竟我d盘根目录下1.txt是一个文件不是文件夹,各位大佬能否帮忙分析分析?

另外,我看课后答案里递归调用后要返回上一级目录,这个步骤有必要吗,不是很理解。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-5 10:22:54 | 显示全部楼层
递归调用后要返回上一级目录,这个步骤有必要吗,不是很理解。
这个我来答。
如:如果你出去玩,你还有回家的必要吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-8-5 11:04:47 | 显示全部楼层
本帖最后由 geen 于 2019-8-5 11:08 编辑

1、当遇到文件夹,程序遇到递归进去文件夹搜索,搜索完不返回上一层(即进入文件夹前的那一层路径),那么怎么进入同一层路径的其他文件夹和其他文件搜索呢?
2、把查询路径修改到上一级d: ,这个我也遇到了,应该是系统为了保护自身而设置了禁止搜整个磁盘(如果可以搜某个磁盘,那么就可以搜整个电脑,应该是怕被病毒程序利用)。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-5 11:18:12 | 显示全部楼层
1、遇到文件夹进行递归(进入文件夹里面搜索),搜索完了,不返回上一层(进入某个文件夹搜索之前的那一层路径)怎么进入上一层的其他文件夹和文件呢?答案是需要返回上一层;
2、"如果我把查询路径修改到上一级d:,就报错了:",系统应该是在哪里设置了禁止搜索整个磁盘,其他路径成功了就代表程序没问题啦;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-8-5 12:24:01 | 显示全部楼层
geen 发表于 2019-8-5 11:18
1、遇到文件夹进行递归(进入文件夹里面搜索),搜索完了,不返回上一层(进入某个文件夹搜索之前的那一层 ...

1、我理解没必要啊,即使不回到上一级,for循环下一个如果还是文件夹,它必然会调用递归函数并更改工作路径为它本身,对吧。所以为什么我的代码即使没返回上一级也正确找到所有结果了。
2、应该不是设置的问题吧,我疑惑的是怎么会有d:\\1.txt\\这种参数出现。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-5 12:50:14 | 显示全部楼层
大佬们我研究出来了,当工作路径本身没返回d:根目录(因为我没加返回上一层级的语句)时,判断1.txt是否是文件时会返回False,因为你上一次递归修改的工作目录下没有这个文件,所以必然会将1.txt作为文件夹处理,再调用函数时,d:\1.txt就是一个错误的文件夹路径。谢谢楼上各位大佬。
加上返回上一层级的语句后,已正常运行并正确返回结果。
当然不建议直接用这个程序在根目录找,如果文件太多的话,递归的局限性你们懂的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-17 11:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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