鱼C论坛

 找回密码
 立即注册
查看: 1399|回复: 11

python第30讲作业第2题 检索文件是否存在 请帮忙看看我的程序为什么不对

[复制链接]
发表于 2020-4-21 19:29:40 | 显示全部楼层 |阅读模式

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

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

x

编写一个程序,用户输入文件名以及开始搜索的路径,搜索该文件是否存在。如遇到文件夹,则进入文件夹继续搜索,程序实现如图:

程序的思路我都写在代码注释里了,自己看了一下午也没看出来哪里出错了,有个BUG我是知道的,可是避开这个BUG结果也不对,请各位帮忙看看哪里出错了!谢谢大家!
path = input('请输入待查找的初始目录:')
name = input('请输入需要查找的目标文件:')

import os
i = j = 1                                            # ij赋初值
while 1:
    all_files = os.listdir(path)                     # 第一层路径的所有文件
    # 共有三种文件:名字一样的、文件夹、名字不一样的其他文件
    for each_file in all_files:
        
        if each_file == name:                        # 如果是名字一样的文件(第一种)
            print(path + '\\'+ each_file)            # 打印路径 + 文件名
            
        elif os.path.isdir(path + '\\'+ each_file):  # 如果是文件夹(第二种)
            path = path + '\\'+ each_file            # 把路径更改成这个文件夹的路径,退出for循环,重新进入while循环
            break                                    # Bug:只能检索当前路径下的第一个文件夹并逐层检索下去,如果有多个文件夹,则其他文件夹无法检索,因为已经跳出了此轮for循环
        
        else:                                        # 如果是第三种
            for each_file in all_files:              # 判断当前路径中是否有文件夹
                
                if os.path.isdir(path + '\\'+ each_file): # 如果当前路径中有文件夹
                    i = 0                            # 引入变量i
                    break                            # 退出这个for循环 
                else:                                # 如果当前路径中没有有文件夹,说明检索完毕
                    j = 0                            # 引入变量j
                    break                            # 退出这个for循环
            
            if i == 0:                               # 如果 i == 0 ,说明当前路径中有文件夹
                continue                             # 继续上一层for循环判断下一个each_file
            
            if j == 0 :                              # 如果 j == 0,说明当前路径中没有文件夹,检索完毕
                break                                # 退出上一层for循环
    if j == 0:                                       
        print('当前路径不存在该文件!')                # 检索完毕打印
        break                                        # 退出while循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-21 19:39:13 | 显示全部楼层
24行的else应该和for齐平
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 19:44:13 | 显示全部楼层
BngThea 发表于 2020-4-21 19:39
24行的else应该和for齐平

这组 if else是在for下面的呀,和for齐平的话是和哪个if对应呢?
而且结果还是不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 19:56:12 | 显示全部楼层
兄弟for循环使用错了,参考下
while a:
    all_files = os.listdir(path)      
  
    print (all_files)
    for index,item in enumerate(all_files):
        
        if item == name:                        

            print('zhen')   
            a = a -1
            break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 20:02:47 | 显示全部楼层
yangxuebabe 发表于 2020-4-21 19:44
这组 if else是在for下面的呀,和for齐平的话是和哪个if对应呢?
而且结果还是不对

else可以和for对应,表示正常循环完的操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 20:10:14 | 显示全部楼层
均昊山 发表于 2020-4-21 19:56
兄弟for循环使用错了,参考下
while a:
    all_files = os.listdir(path)      

不好意思没太明白错在哪里了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 20:11:28 | 显示全部楼层
BngThea 发表于 2020-4-21 20:02
else可以和for对应,表示正常循环完的操作

但是结果还是不对呀。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 20:19:34 | 显示全部楼层
yangxuebabe 发表于 2020-4-21 20:11
但是结果还是不对呀。。。

结果不对是你代码的逻辑问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 20:48:51 | 显示全部楼层
本帖最后由 均昊山 于 2020-4-21 20:50 编辑
yangxuebabe 发表于 2020-4-21 20:11
但是结果还是不对呀。。。


兄弟参考这个,后缀名判断一下
path = input('请输入待查找的初始目录:')
name = input('请输入需要查找的目标文件:')
a = 1
import os
i = 1                                            # ij赋初值
while i:
    all_files = os.listdir(path)                     # 第一层路径的所有文件
    # 共有三种文件:名字一样的、文件夹、名字不一样的其他文件
    #print (all_files)
    for index,item in enumerate(all_files):
        
        if item == name:                        # 如果是名字一样的文件(第一种)


            print(path + '\\'+ all_files[index])           # 打印路径 + 文件名
            i = i-1
            break
     
    if i == 1:
        os.path.isdir(path + '\\'+ all_files[index])  # 如果是文件夹(第二种)
        path = path + '\\'+ all_files[index]            # 把路径更改成这个文件夹的路径,退出for循环,重新进入while循环
              
        for index,item in enumerate(all_files):
            if item == name:
                print(path + '\\'+ all_files[index])           # 打印路径 + 文件名
                i = i-1
                break

for循环里得结合4楼,获取的内容,for循环里if判断里多少次?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 18:42:54 | 显示全部楼层
BngThea 发表于 2020-4-21 20:19
结果不对是你代码的逻辑问题

能说一下是哪里出错了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 18:53:26 | 显示全部楼层
均昊山 发表于 2020-4-21 20:48
兄弟参考这个,后缀名判断一下
path = input('请输入待查找的初始目录:')
name = input('请输入需要 ...

您的代码这段代码是不是有点问题:

一旦遇到目标文件,打印之后 i=0,退出for循环,进入while循环,此时路径没变,all_files没变,一切都没变,不是陷入循环出不来了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 20:53:59 | 显示全部楼层
path = input('请输入待查找的初始目录:')
name = input('请输入需要查找的目标文件:')

import os
j = 1                                            
count = 0                                            
while j:                                             
    all_files = os.listdir(path)                    
                                                     
    for each_file in all_files:
        
        if each_file == name:                       
            print(path + '\\'+ each_file)            
            count += 1
            
        elif os.path.isdir(path + '\\'+ each_file):  
            path = path + '\\'+ each_file            
            break  # Bug1:只能检索当前路径下的第一个文件夹并逐层检索下去,如果有多个文件夹,则其他文件夹无法检索,因为已经跳出了此轮for循环
        
        else:   # 如果是第三种,判断当前路径中是否有文件夹,利用文件夹的后缀为空这一特性                                     
            ext_list = []                            # 所有文件后缀列表
            for each_file in all_files:             
                ext = os.path.splitext(each_file)[1] # 取每个文件的后缀
                ext_list.append(ext)
                                 
            if '' in ext_list:                       # 文件夹后缀为空,如果当前路径中有文件夹
                continue                             # 继续上一层for循环判断下一个each_file 
            else:                                    # 如果当前路径中没有文件夹,说明检索完毕,跳出所有循环
                j = 0                                

        if j == 0 :                              
            break                                
            
if count == 0:                                                                    
    print('当前路径不存在该文件!')                    

我自己修改了一下代码,现在只有那个Bug了,可以帮忙完善一下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 20:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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