没有隐藏文件夹的os.walk

lol*_*pop 33 python linux os.walk

我需要列出文件夹中包含目录路径的所有文件.我尝试使用os.walk,这显然是完美的解决方案.

但是,它还列出了隐藏的文件夹和文件.我希望我的应用程序不要列出任何隐藏的文件夹或文件.是否有任何标志可以用来使它不产生任何隐藏文件?

跨平台对我来说并不重要,只要它适用于linux(.*pattern)就可以了.

Mar*_*ers 80

不,没有选择可以os.walk()跳过那些.你自己需要这样做(这很容易):

for root, dirs, files in os.walk(path):
    files = [f for f in files if not f[0] == '.']
    dirs[:] = [d for d in dirs if not d[0] == '.']
    # use files and dirs
Run Code Online (Sandbox Code Playgroud)

注意dirs[:] =切片分配; os.walk递归遍历中列出的子目录dirs.通过更换元件dirs与那些满足条件(例如,目录名称不开始.),os.walk()将不能访问不符合标准的目录.

这仅适用于保留topdown关键字参数True文档os.walk():

如果topdownTrue,调用者可以修改就地dirnames中列表(可能使用del或切片分配),并且walk()只会递归到他们的名字留在子目录dirnames中 ; 这可用于修剪搜索,强制执行特定的访问顺序,甚至可以walk()walk()再次恢复之前通知调用者创建或重命名的目录.

  • @linrongbin:可以,但是这样做没有任何优势。`files = [...]`将`files'绑定到新列表,而`files [:] = [...]`替换列表中已绑定文件'files'的元素。当os.walk()给您列表时,没有其他代码在使用该列表。另一方面,os.walk()使用`dirs`查找下一个目录并为其生成文件,因此,如果您不使用* dirs [:] = [...],则以`.`开头的目录仍然会被访问。 (2认同)

DMf*_*fll 8

我意识到这个问题没有被问到,但我有一个类似的问题,我想要排除隐藏文件和以文件开头的文件__,特别是__pycache__目录.我找到了这个问题,因为我试图找出为什么我的列表理解不符合我的预期.我没有修改列表dirnames[:].

我创建了一个我想要排除的前缀列表,并修改了dirnames,如下所示:

    exclude_prefixes = ('__', '.')  # exclusion prefixes
    for dirpath, dirnames, filenames in os.walk(node):
        # exclude all dirs starting with exclude_prefixes
        dirnames[:] = [dirname
                       for dirname in dirnames
                       if not dirname.startswith(exclude_prefixes)]
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,`startswith` 也可以采用字符串元组,因此您可以摆脱内部 for 循环,只需使用 `not dirname.startswith(exclude_prefixes)` https://docs.python.org/2/library/stdtypes .html#str.startswith(python 2.5 及更高版本) (2认同)