Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使os.walk以非标准方式工作_Python_Os.walk - Fatal编程技术网

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

Python 使os.walk以非标准方式工作,python,os.walk,Python,Os.walk,我尝试按以下顺序执行以下操作: 使用os.walk()查看每个目录。 每个目录都有子文件夹,但我只对第一个子文件夹感兴趣。因此,目录如下所示: /home/RawData/SubFolder1/SubFolder2 比如说。在RawData2中,我希望文件夹停止在子文件夹1级别 问题是,os.walk()似乎遍历了所有的RawData文件夹,我不知道如何让它停止 下面是我到目前为止所做的——我已经尝试过用变量dirs替换根或文件的许多其他组合,但这似乎并不能满足我的需要 import os

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

使用
os.walk()
查看每个目录。
每个目录都有
子文件夹
,但我只对第一个
子文件夹
感兴趣。因此,目录如下所示:

/home/RawData/SubFolder1/SubFolder2
比如说。在RawData2中,我希望文件夹停止在子文件夹1级别

问题是,
os.walk()
似乎遍历了所有的
RawData
文件夹,我不知道如何让它停止

下面是我到目前为止所做的——我已经尝试过用变量dirs替换根或文件的许多其他组合,但这似乎并不能满足我的需要

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
因此,从根开始,获取第一级中的所有内容,然后查找
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/”)

通过使用
top-down=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

现在还不清楚你的意思是什么,你能解释更多吗?好吧,os.walk()遍历了所有级别的原始数据和相关的子文件夹。我对它感兴趣的只是一个层次,而不是所有层次。也许一个不同的函数更合适?也许是一个有用的替代方法?那么你的意思是你只需要根的路径和子文件夹的名称对吗?是的,所以不要保留子文件夹1/子文件夹2/子文件夹3的整个结构,而是将其限制在子文件夹1。最后,我将把子文件夹1、2、3中的所有文件放到这个新文件夹中。问题是,我需要子文件夹2在一堆不同的文件夹中迭代。我不确定你的方法是否能做到这一点。所以你说的是你想浏览过滤匹配的所有子目录?因此,如果您过滤掉/root\u path/*/sub1/sub2。然后你想对这些路径中的每一个进行迭代吗?我马上就来试试。将报告运行情况。这样更好,因为它现在生成“子文件夹1”,但它仍然生成子文件夹2级别的所有文件夹。@ZR:我应该测试一下。列表是一个可变对象,但
l=[]
不会更改原始列表,只是将引用点设置为空列表。它应该是
dell[:]
。后期编辑