鱼C论坛

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

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

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

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

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

x

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

程序的思路我都写在代码注释里了,自己看了一下午也没看出来哪里出错了,有个BUG我是知道的,可是避开这个BUG结果也不对,请各位帮忙看看哪里出错了!谢谢大家!

  1. path = input('请输入待查找的初始目录:')
  2. name = input('请输入需要查找的目标文件:')

  3. import os
  4. i = j = 1                                            # ij赋初值
  5. while 1:
  6.     all_files = os.listdir(path)                     # 第一层路径的所有文件
  7.     # 共有三种文件:名字一样的、文件夹、名字不一样的其他文件
  8.     for each_file in all_files:
  9.         
  10.         if each_file == name:                        # 如果是名字一样的文件(第一种)
  11.             print(path + '\\'+ each_file)            # 打印路径 + 文件名
  12.             
  13.         elif os.path.isdir(path + '\\'+ each_file):  # 如果是文件夹(第二种)
  14.             path = path + '\\'+ each_file            # 把路径更改成这个文件夹的路径,退出for循环,重新进入while循环
  15.             break                                    # Bug:只能检索当前路径下的第一个文件夹并逐层检索下去,如果有多个文件夹,则其他文件夹无法检索,因为已经跳出了此轮for循环
  16.         
  17.         else:                                        # 如果是第三种
  18.             for each_file in all_files:              # 判断当前路径中是否有文件夹
  19.                
  20.                 if os.path.isdir(path + '\\'+ each_file): # 如果当前路径中有文件夹
  21.                     i = 0                            # 引入变量i
  22.                     break                            # 退出这个for循环
  23.                 else:                                # 如果当前路径中没有有文件夹,说明检索完毕
  24.                     j = 0                            # 引入变量j
  25.                     break                            # 退出这个for循环
  26.             
  27.             if i == 0:                               # 如果 i == 0 ,说明当前路径中有文件夹
  28.                 continue                             # 继续上一层for循环判断下一个each_file
  29.             
  30.             if j == 0 :                              # 如果 j == 0,说明当前路径中没有文件夹,检索完毕
  31.                 break                                # 退出上一层for循环
  32.     if j == 0:                                       
  33.         print('当前路径不存在该文件!')                # 检索完毕打印
  34.         break                                        # 退出while循环
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-21 19:39:13 | 显示全部楼层
24行的else应该和for齐平
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这组 if else是在for下面的呀,和for齐平的话是和哪个if对应呢?
而且结果还是不对
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

else可以和for对应,表示正常循环完的操作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思没太明白错在哪里了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

但是结果还是不对呀。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

结果不对是你代码的逻辑问题
小甲鱼最新课程 -> https://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判断里多少次?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

能说一下是哪里出错了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

一旦遇到目标文件,打印之后 i=0,退出for循环,进入while循环,此时路径没变,all_files没变,一切都没变,不是陷入循环出不来了吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  29.         if j == 0 :                              
  30.             break                                
  31.             
  32. if count == 0:                                                                    
  33.     print('当前路径不存在该文件!')                    
复制代码


我自己修改了一下代码,现在只有那个Bug了,可以帮忙完善一下吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 21:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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