鱼C论坛

 找回密码
 立即注册
查看: 1225|回复: 13

[已解决]030讲第二题搜索文件的问题

[复制链接]
发表于 2020-6-28 20:57:04 | 显示全部楼层 |阅读模式

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

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

x
题目要求是这样的:编写一个程序,用户输入文件名以及开始搜索的路径,搜索该文件是否存在。如遇到文件夹,则进入文件夹继续搜索
然后我自己写的代码如下,还没看答案。。

import os,os.path

def finds(file,user_path):
    while True:
        for each_file in os.listdir(path=user_path):           
            if file in os.listdir(path=user_path):
                print('该文件在%s下存在'% user_path)
            elif os.path.isdir(os.path.join(user_path,each_file)) == True:
                user_path = os.path.join(user_path,each_file)
                finds(file,user_path)   
            break
        break

file = input('请输入要查找的文件名:')
user_path = input('请输入要查找的文件夹:')
finds(file,user_path)

现在的问题是只能找一层,碰到文件夹进不去。应该是elif哪里出问题了,求助一下!!

最佳答案
2020-6-28 22:08:32
狗宁 发表于 2020-6-28 21:51
还是要重新另写一个代码



改成这样即可:
import os


def finds(file, user_path):

        for each_file in os.listdir(path=user_path):
            if file == each_file:
                print('该文件在%s下存在.' % user_path)

            elif os.path.isdir(os.path.join(user_path, each_file)):
                user_path = os.path.join(user_path, each_file)
                finds(file, user_path)
                user_path = user_path[::-1].split('\\',1)[1][::-1]




file = input('请输入要查找的文件名:')
user_path = input('请输入要查找的文件夹:')
finds(file, user_path)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-28 21:08:03 | 显示全部楼层
import os,os.path

def finds(file,user_path):
    while True:
        for each_file in os.listdir(path=user_path):           
            if file in os.listdir(path=user_path):
                print('该文件在%s下存在'% user_path)
            elif os.path.isdir(os.path.join(user_path,each_file)) == True:
                user_path = os.path.join(user_path,each_file)
                finds(file,user_path)
                os.chdir(os.pardir)
            break
        break

file = input('请输入要查找的文件名:')
user_path = input('请输入要查找的文件夹:')
finds(file,user_path)
在文件夹查找时,加一个os.chdir(os.pardir),目的是返回到上一级文件,然后继续查找
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-28 21:11:21 | 显示全部楼层
小甲鱼的铁粉 发表于 2020-6-28 21:08
在文件夹查找时,加一个os.chdir(os.pardir),目的是返回到上一级文件,然后继续查找

不对,我说的不对,别看我的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-28 21:13:20 | 显示全部楼层


你在 for 循环缩进下直接放了 break  导致你遍历第一个文件时候就 break 了呀,而且就算你递归也会导致没错递归的只反馈 第一个文件 就 break 退出循环了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-28 21:50:33 | 显示全部楼层
Twilight6 发表于 2020-6-28 21:13
你在 for 循环缩进下直接放了 break  导致你遍历第一个文件时候就 break 了呀,而且就算你递归也会导致 ...

那大佬指点一下怎么修改一下呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-28 21:51:08 | 显示全部楼层
Twilight6 发表于 2020-6-28 21:13
你在 for 循环缩进下直接放了 break  导致你遍历第一个文件时候就 break 了呀,而且就算你递归也会导致 ...

还是要重新另写一个代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-28 22:04:11 | 显示全部楼层
狗宁 发表于 2020-6-28 21:51
还是要重新另写一个代码

是的  但是不用改动太大,等等我帮你改下把    你的路径每次拼接后会导致下次循环会在之前的基础上拼接 实际上课后答案用工作目录的比较方便些,骚等下我帮你改改你的代码把~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-28 22:08:32 | 显示全部楼层    本楼为最佳答案   
狗宁 发表于 2020-6-28 21:51
还是要重新另写一个代码



改成这样即可:
import os


def finds(file, user_path):

        for each_file in os.listdir(path=user_path):
            if file == each_file:
                print('该文件在%s下存在.' % user_path)

            elif os.path.isdir(os.path.join(user_path, each_file)):
                user_path = os.path.join(user_path, each_file)
                finds(file, user_path)
                user_path = user_path[::-1].split('\\',1)[1][::-1]




file = input('请输入要查找的文件名:')
user_path = input('请输入要查找的文件夹:')
finds(file, user_path)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 10:23:23 | 显示全部楼层

哇塞 谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 10:36:59 | 显示全部楼层

客气了~~~加油吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 10:42:31 | 显示全部楼层

这句还是不太明白
user_path = user_path[::-1].split('\\',1)[1][::-1]
是不是先把user_path顺序颠倒,然后把最头的'\'号给分割掉,再把顺序颠倒回来呢?(个人看字面是这个意思)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 10:46:24 | 显示全部楼层
狗宁 发表于 2020-6-29 10:42
这句还是不太明白
user_path = user_path[::-1].split('\\',1)[1][::-1]
是不是先把user_path顺序颠倒 ...

这里主要目的是返回上层目录,倒过来切片一次 \ 然后去掉那个第一个就是当前文件夹  然后因为把字符串颠倒了所以倒回来 哈哈,看的确实有点懵懵的哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 10:48:12 | 显示全部楼层
Twilight6 发表于 2020-6-29 10:46
这里主要目的是返回上层目录,倒过来切片一次 \ 然后去掉那个第一个就是当前文件夹  然后因为把字符串颠 ...

好的,看来没理解错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 10:51:14 | 显示全部楼层
狗宁 发表于 2020-6-29 10:48
好的,看来没理解错

其实可以更简单的 我当时没想到  

用 split 切割所有  \  然后用切片操作选择  [:-1] 把最后一个目录去掉  然后用 '\'.join(list) 拼接起来 这样更好理解

不要一直颠倒了哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 07:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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