3

スクリプトの 1 つが必要とするサブディレクトリの指定を自動化しようとしています。アイデアは、スクリプトで C: ドライブを検索して、特定の名前のフォルダーを探すことです。私の考えでは、これには再帰的な検索機能が必要です。計画は、すべてのサブディレクトリをチェックすることです。目的のディレクトリがない場合は、現在のサブディレクトリのサブディレクトリの検索を開始します

これを行う方法を調査しているときに、この質問に出くわし、os.walk(dir).next()[1]ディレクトリを一覧表示するために使用し始めました。これは限られた成功しか収めませんでした。スクリプトがディレクトリを検索すると、基本的にあきらめて中断し、StopIterationエラーが発生します。内のサブディレクトリを検索する出力例を以下に示しますTEST1

C:\Python27>test.py
curDir:  C:\Python27
['DLLs', 'Doc', 'include', 'Lib', 'libs', 'pyinstaller-2.0', 'Scripts', 'tcl', 'TEST1',     'Tools']
curDir:  DLLs
[]
curDir:  Doc
[]
curDir:  include
[]
curDir:  Lib
['bsddb', 'compiler', 'ctypes', 'curses', 'distutils', 'email', 'encodings', 'hotshot',     
'idlelib', 'importlib', 'json', 'lib-tk', 'lib2to3', 'logging', 'msilib', 
'multiprocessing', 'pydoc_data', 'site-packages', 'sqlite3', 'test', 'unittest', 'wsgiref', 'xml']
curDir:  bsddb
Traceback (most recent call last):
  File "C:\Python27\test.py", line 24, in <module>
    if __name__ == "__main__": main()
  File "C:\Python27\test.py", line 21, in main
    path = searcher(os.getcwd())
  File "C:\Python27\test.py", line 17, in searcher
    path = searcher(entry)
  File "C:\Python27\test.py", line 17, in searcher
    path = searcher(entry)
  File "C:\Python27\test.py", line 6, in searcher
    dirList = os.walk(dir).next()[1]
StopIteration

curDir検索されている現在のディレクトリであり、出力の次の行はサブディレクトリのリストです。プログラムがサブディレクトリのないディレクトリを見つけると、1 レベル上に戻り、次のディレクトリに移動します。

必要に応じてコードを提供できますが、テキストの壁がさらに大きくなるのを避けるために、最初はコードを投稿したくありませんでした。

私の質問は、いくつかのフォルダーを検索した後にスクリプトがあきらめるのはなぜですか? よろしくお願いします。

4

2 に答える 2

4

StopIterationイテレータが生成する値がなくなるたびに発生します。

なぜあなたは使用していos.walk(dir).next()[1]ますか?すべてを for ループで行う方が簡単ではないでしょうか? お気に入り:

for root, dirs, files in os.walk(mydir):
    #dirs here should be equivalent to dirList

のドキュメントはこちらですos.walk

于 2013-08-06T15:56:59.597 に答える
1

私にとってうまくいったのは、ディレクトリ名だけでなく、os.walkでフルパスを指定することです:

# fullpath of the directory of interest with subfolders to be iterated (Mydir)
fullpath = os.path.join(os.path.dirname(__file__),'Mydir')

# iteration
subfolders = os.walk(fullpath).next()[1]

これは特に、os.walk を含むモジュールがサブフォルダー自体にあり、スクリプトによって親フォルダーにインポートされたときに発生しました。

Parent/
    script
    Folder/
        module
        Mydir/
            Subfolder1
            Subfolder2

スクリプトでは、os.walk('Mydir') は存在しない Parent/Mydir を検索します。

一方、os.walk(fullpath) は Parent/Folder/Mydir を参照します。

于 2014-06-29T12:46:25.313 に答える