0

我正在寻找一些帮助来从我的循环中获得所需的输出。

我正在尝试编译通向任何名为“已发布”的文件夹的路径列表。它几乎可以工作,但如果有人能告诉我一种方法来阻止循环吐出任何“已发布”的子目录,我将不胜感激。

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!');
4

2 回答 2

1

发生的事情是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 的观点,即我们也不想匹配“未发布”。

于 2012-04-11T17:07:08.157 回答
0
>>> 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:\windows\MUI
C:\windows\AppPatch\MUI
C:\windows\Help\MUI
C:\windows\Help\Tours\htmlTour\MUI
C:\windows\Help\Tours\mmTour\MUI
C:\windows\Help\Tours\WindowsMediaPlayer\MUI
C:\windows\Microsoft.NET\Framework\v2.0.50727\MUI
C:\windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\MUI
C:\windows\pchealth\MUI
C:\windows\Resources\Themes\Luna\MUI
C:\windows\Resources\Themes\Luna\Shell\Homestead\MUI
C:\windows\Resources\Themes\Luna\Shell\Metallic\MUI
C:\windows\Resources\Themes\Luna\Shell\NormalColor\MUI
C:\windows\srchasst\MUI
C:\windows\system32\MUI
C:\windows\system32\oobe\MUI
C:\windows\system32\wbem\MUI
C:\windows\Web\MUI

是的,您可以在迭代时触摸dirs(所以这里不会浏览儿童)!

我使用小写比较,因为 Windows 不关心大小写,但它会显示它。在类 Unix 系统上,if folder in dirs没有循环的比较将是一个好方法。

于 2012-04-11T17:17:55.547 回答