我正在编写一个脚本,它下载到目录树(使用os.walk()),然后访问与特定文件扩展名匹配的每个文件.但是,由于我的工具将使用的某些目录树也包含子目录,而这些子目录又包含很多无用的东西(为了这个脚本的目的),我想我会为用户添加一个选项来指定要从遍历中排除的目录列表.
使用os.walk()很容易.毕竟,由我来决定我是否真的想要访问os.walk()产生的相应文件/目录,或者只是跳过它们.问题是,如果我有一个像这样的目录树:
root--
|
--- dirA
|
--- dirB
|
--- uselessStuff --
|
--- moreJunk
|
--- yetMoreJunk
Run Code Online (Sandbox Code Playgroud)
我想要排除uselessStuff及其所有子节点,os.walk()仍将下载到uselessStuff的所有(可能是数千个)子目录中,不用说,它会减慢很多东西.在一个理想的世界里,我可以告诉os.walk()甚至不会再让无用的孩子产生无用的东西了,但据我所知,没有办法做到这一点(是吗?).
有没有人有想法?也许有第三方库提供类似的东西?
我想知道是否可以在python3中强制os.walk按字母顺序访问目录.例如,这是一个目录和一些将遍历此目录的代码:
ryan:~/bktest$ ls -1 sample
CD01
CD02
CD03
CD04
CD05
--------
def main_work_subdirs(gl):
for root, dirs, files in os.walk(gl['pwd']):
if root == gl['pwd']:
for d2i in dirs:
print(d2i)
Run Code Online (Sandbox Code Playgroud)
当python代码点击上面的目录时,输出如下:
ryan:~/bktest$ ~/test.py sample
CD03
CD01
CD05
CD02
CD04
Run Code Online (Sandbox Code Playgroud)
我想强迫步行按字母顺序访问这些目录01, 02 ... 05.在python3 doc中os.walk,它说:
当topdown为True时,调用者可以就地修改dirnames列表(可能使用del或slice赋值),而walk()只会递归到名称保留在dirnames中的子目录中; 这可以用来修剪搜索,强加一个特定的访问顺序
这是否意味着我可以强加一个按字母顺序排列的访问顺序os.walk?如果是这样,怎么样?
根据 Python 3文档, os.walk返回一个 3 元组。但是,这不起作用:
root, dirs, files = os.walk('path')
Run Code Online (Sandbox Code Playgroud)
这也不:
(root, dirs, files) = os.walk('path')
Run Code Online (Sandbox Code Playgroud)
它总是产生:
ValueError: not enough values to unpack (expected 3, got 1)
Run Code Online (Sandbox Code Playgroud)
我发现的所有示例都os.walk嵌入os.walk在 for 循环中:
for root, dirs, files in os.walk('path'):
Run Code Online (Sandbox Code Playgroud)
为什么?这里到底要迭代什么?root是字符串,dirs是files列表。然而,大多数示例都会再次迭代dirs和files:
for root, dirs, files in os.walk('path'):
for name in files:
print(name)
for name in dirs:
print(name)
Run Code Online (Sandbox Code Playgroud)
内部 for 循环对我来说很有意义,但我不明白外部 for 循环的用途。
为什么对 3 元组的赋值在os.walk嵌入 …