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[:]
。后期编辑