我正在寻找一些帮助,以便从我的循环中获得所需的输出。
我正在尝试编译指向名为"已发布"的任何文件夹的路径列表。它几乎有效,但如果有人能告诉我一种方法来阻止循环吐出任何"已发布"的子目录,我将不胜感激。
import os
file = open('published_directories_list.txt', 'w');
top = "T:PROJECTS";
for root, dirs, files in os.walk(top, topdown=False):
for name in dirs:
myPath = os.path.join(root, name);
if 'published' in myPath:
print (myPath);
file.write(myPath + 'n');
else:
print (myPath + ' - no published directory!');
file.close();
print('DONE!');
正在发生的事情是os.walk
遍历top
下的每个目录。因此,如果您有这样的目录结构:
top
|
- published
| |
| - something
|
- other
在循环中的某个点,您的线路:
myPath = os.path.join(root, name)
将加入/top/published
根和something
的名字。显然,当您检查if "published" is in myPath
时,它会是。即使您正在查看 published
的子目录,您仍然会在路径中看到名称"已发布"。
解决此问题的一种简单方法是检查myPath
是否以"已发布"结尾(使用 endswith 字符串方法),而不是检查它是否仅包含它。您可以将if
语句修改为:
if myPath.endswith('/published')
请注意,我在我们正在检查的内容的开头包含一个反斜杠。这应该可以解决DSM的观点,即我们也不想匹配"未发布"。
>>> import os
>>> folder = 'MUI'
>>> for root, dirs, files in os.walk('C:\windows'):
for dir_ in dirs:
if folder.lower() == dir_.lower():
print os.path.join(root, folder)
dirs.remove(dir_)
C:windowsMUI
C:windowsAppPatchMUI
C:windowsHelpMUI
C:windowsHelpTourshtmlTourMUI
C:windowsHelpToursmmTourMUI
C:windowsHelpToursWindowsMediaPlayerMUI
C:windowsMicrosoft.NETFrameworkv2.0.50727MUI
C:windowsMicrosoft.NETFrameworkv3.0Windows Communication FoundationMUI
C:windowspchealthMUI
C:windowsResourcesThemesLunaMUI
C:windowsResourcesThemesLunaShellHomesteadMUI
C:windowsResourcesThemesLunaShellMetallicMUI
C:windowsResourcesThemesLunaShellNormalColorMUI
C:windowssrchasstMUI
C:windowssystem32MUI
C:windowssystem32oobeMUI
C:windowssystem32wbemMUI
C:windowsWebMUI
是的,您可以在迭代时触摸dirs
(因此不会在此处浏览儿童)!!
我使用了小写的比较,因为 Windows 不关心大小写,但它会显示它。在类Unix系统上,像没有循环的if folder in dirs
这样的比较将是好方法。