如何循环这个Python程序

时间:2013-04-30 22:54:13

标签: python

如何循环使用此代码,以便在未找到文件的情况下要求用户搜索其他文件?

import os, sys
from stat import *
from os.path import join

lookfor = input("\nPlease enter file name you want to search? \n")
def search(directory):
      for files in os.listdir(directory):
            fileItem = os.path.join(directory, files)
            fileItemStatInfo = os.stat(fileItem)
            if S_ISDIR(fileItemStatInfo.st_mode):
                  search(fileItem)
            elif S_ISREG(fileItemStatInfo.st_mode):
                  print("Searching", fileItem)
                  if lookfor in files:
                        print("\nThe File Has Been Found: %s" % join(directory, lookfor))
                        break

1 个答案:

答案 0 :(得分:2)

首先,您需要让search返回成功或失败:

def search(directory):
      for files in os.listdir(directory):
            fileItem = os.path.join(directory, files)
            fileItemStatInfo = os.stat(fileItem)
            if S_ISDIR(fileItemStatInfo.st_mode):
                  return search(fileItem)
            elif S_ISREG(fileItemStatInfo.st_mode):
                  print("Searching", fileItem)
                  if lookfor in files:
                        print("\nThe File Has Been Found: %s" % join(directory, lookfor))
                        return True

(注意,如果我们从for循环的末尾开始,我们将从函数的末尾开始,这意味着我们返回None。因此,函数只返回{{ {1}},是真实的,或True,但不是。)

现在,你只需循环直到它返回true:

None

所有这一切,我认为while True: lookfor=input("\nPlease enter file name you want to search? \n") if search(lookfor): break print('Could not find that file, sorry. Try again.') 不符合您的要求 - 您也可以极大地简化它。

首先,我不确定您是否尝试将search用作全局变量,或者作为lookfor函数中的闭包......但无论如何,您可能不应该这样做。把它作为论据传递。

此外,拥有一个名为search的变量来保存每个文件名而不是它们的集合,这非常令人困惑。

如果您想以递归方式遍历目录树,请使用files而不是尝试自己实现它。

你应该打印出找到的文件名,而不是找到的片段。

把它们放在一起:

os.walk

当然在大多数现实代码中,您可能希望返回路径名,因此代码的其余部分可以使用它(例如,打开文件),而不仅仅是打印出来:

def search(lookfor, directory):
    for dirpath, dirnames, filenames in os.walk(directory):
        for filename in filenames:
            if lookfor in filename:
                print("\nThe File Has Been Found: %s" % join(dirpath, filename))
                return True