狗宁 发表于 2020-6-28 20:57:04

030讲第二题搜索文件的问题

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

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 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),目的是返回到上一级文件,然后继续查找

小甲鱼的铁粉 发表于 2020-6-28 21:11:21

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

不对,我说的不对{:10_266:},别看我的了

Twilight6 发表于 2020-6-28 21:13:20



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

狗宁 发表于 2020-6-28 21:50:33

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

那大佬指点一下怎么修改一下呢?

狗宁 发表于 2020-6-28 21:51:08

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

还是要重新另写一个代码

Twilight6 发表于 2020-6-28 22:04:11

狗宁 发表于 2020-6-28 21:51
还是要重新另写一个代码

是的但是不用改动太大,等等我帮你改下把    你的路径每次拼接后会导致下次循环会在之前的基础上拼接 实际上课后答案用工作目录的比较方便些,骚等下我帮你改改你的代码把~~

Twilight6 发表于 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]




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

狗宁 发表于 2020-6-29 10:23:23

Twilight6 发表于 2020-6-28 22:08
改成这样即可:

哇塞 谢谢大佬

Twilight6 发表于 2020-6-29 10:36:59

狗宁 发表于 2020-6-29 10:23
哇塞 谢谢大佬

客气了~~~{:10_297:}加油吧

狗宁 发表于 2020-6-29 10:42:31

Twilight6 发表于 2020-6-28 22:08
改成这样即可:

这句还是不太明白
user_path = user_path[::-1].split('\\',1)[::-1]
是不是先把user_path顺序颠倒,然后把最头的'\'号给分割掉,再把顺序颠倒回来呢?(个人看字面是这个意思)

Twilight6 发表于 2020-6-29 10:46:24

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

这里主要目的是返回上层目录,倒过来切片一次 \ 然后去掉那个第一个就是当前文件夹然后因为把字符串颠倒了所以倒回来 哈哈,看的确实有点懵懵的哈

狗宁 发表于 2020-6-29 10:48:12

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

好的,看来没理解错

Twilight6 发表于 2020-6-29 10:51:14

狗宁 发表于 2020-6-29 10:48
好的,看来没理解错

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

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

不要一直颠倒了哈哈
页: [1]
查看完整版本: 030讲第二题搜索文件的问题