我正在尝试自动化我的一个脚本所需的子目录的规范。我们的想法是让脚本在C:盘中搜索特定名称的文件夹。在我看来,这需要一个递归搜索功能。计划是检查所有子目录,如果没有所需目录,则开始搜索当前子目录的子目录
在研究如何执行此操作时,我遇到this question并开始使用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
是正在搜索的当前目录,下一行输出是子目录列表。一旦程序找到一个没有子目录的目录,它就会重新启动一个级别并转到下一个目录。
如果需要,我可以提供我的代码,但不想最初发布它以避免更大的文本墙。
我的问题是:为什么在搜索几个文件夹后脚本会放弃?在此先感谢您的帮助!
答案 0 :(得分:3)
StopIteration
。
您为什么使用os.walk(dir).next()[1]
?在for循环中做所有事情不是更容易吗?像:
for root, dirs, files in os.walk(mydir):
#dirs here should be equivalent to dirList
以下是os.walk
的文档。
答案 1 :(得分: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(&#39; Mydir&#39;)将查看不存在的Parent / Mydir。
另一方面,os.walk(fullpath)将在Parent / Folder / Mydir中查找。