3

我正在尝试自动化我的一个脚本所需的子目录的规范。这个想法是让脚本在 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是正在搜索的当前目录,下一行输出是子目录列表。一旦程序找到一个没有子目录的目录,它就会返回上一级并转到下一个目录。

如果需要,我可以提供我的代码,但最初不想发布它以避免更大的文本墙。

我的问题是:为什么脚本在搜索了几个文件夹后就放弃了?在此先感谢您的帮助!

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 回答