如何循环使用此代码,以便在未找到文件的情况下要求用户搜索其他文件?
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
答案 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