当前位置: 代码迷 >> python >> 使os.walk以非标准方式工作
  详细解决方案

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

热度:111   发布时间:2023-06-13 13:41:55.0

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

使用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))

我建议你改用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

所以,从你的root开始,获取第一级的所有内容,然后查找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)

注意os.walk文档说:

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

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

你可以通过使用topdown=True和清除dirs轻松地让walk不要递归:

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