-4

ファイルが見つからない場合に別のファイルを検索するようにユーザーに要求するように、このコードをループするにはどうすればよいですか?

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
4

1 に答える 1

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ます。したがって、関数は 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
于 2013-04-30T23:00:56.443 に答える