使os.walk以非标准方式工作

时间:2015-10-17 16:52:15

标签: python os.walk

我尝试按以下顺序执行以下操作:

使用os.walk()关闭每个目录 每个目录都有subfolders,但我只对第一个subfolder感兴趣。所以目录看起来像:

/home/RawData/SubFolder1/SubFolder2

例如。我希望在RawData2中,让文件夹停留在SubFolder1级别。

问题是,似乎os.walk()遍历了RawData个文件夹中的所有内容,我不确定如何让它停止。

以下是我到目前为止的情况 - 我已尝试过将变量dirs替换为root或文件的其他组合,但这似乎并没有让我得到我想要的东西。

import os 

for root, dirs, files in os.walk("/home/RawData"): 

    os.chdir("/home/RawData2/")
    make_path("/home/RawData2/"+str(dirs))

2 个答案:

答案 0 :(得分:1)

我建议你改用glob。

正如glob上的帮助描述:

glob(pathname)
    Return a list of paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

因此,您的模式是每个第一级目录,我认为将是这样的:

/root_path/*/sub_folder1/sub_folder2

所以,你从你的根开始,在第一级获得所有内容,然后寻找sub_folder1/sub_folder2。我认为有效。

把它们放在一起:

from glob import glob

dirs = glob('/root_path/*/sub_folder1/sub_folder2')

# Then iterate for each path
for i in dirs:
    print(i)

答案 1 :(得分:1)

小心os.walk的文档说:

  

不要在walk()的恢复之间更改当前工作目录。 walk()从不更改当前目录,并假定其调用者不是

所以你应该避免os.chdir("/home/RawData2/")循环中的walk

您可以使用walk并清除topdown=True轻松提问dirs不要递归:

for root, dirs, files in os.walk("/home/RawData", True):
    for rep in dirs:
        make_path(os.join("/home/RawData2/", rep )
        # add processing here
    del dirs[]  # tell walk not to recurse in any sub directory