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
ます。したがって、関数は return True
、 withのみが true であり、どちらが true でNone
ないかです。)
ここで、true が返されるまでループします。
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
もちろん、ほとんどの実際のコードでは、おそらくパス名を返したいと思うでしょう。そのため、コードの残りの部分は、単に出力する代わりにそれを使用できます (たとえば、ファイルを開くため):
def search(lookfor, directory):
for dirpath, dirnames, filenames in os.walk(directory):
for filename in filenames:
if lookfor in filename:
return join(dirpath, filename)
while True:
lookfor=input("\nPlease enter file name you want to search? \n")
path = search(lookfor)
if path:
break
print('Could not find that file, sorry. Try again.')
with open(path) as f:
pass # now we can actually use the file we searched so hard for