没有隐藏文件夹的os.walk

时间:2012-11-19 12:48:24

标签: python linux os.walk

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

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

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

3 个答案:

答案 0 :(得分:72)

不,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

注意dirs[:] =切片分配; os.walk以递归方式遍历dirs中列出的子目录。通过将dirs元素替换为满足条件的元素(例如,名称不以.开头的目录),os.walk()将不会访问目录不符合标准。

仅当您将topdown关键字参数与documentation of os.walk()保持True时才有效:

  

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

答案 1 :(得分:7)

我意识到这个问题没有被问到,但是我有一个类似的问题,我想要排除隐藏文件和以__开头的文件,特别是__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)]

答案 2 :(得分:0)

我的用例与OP相似,只是我想返回某个文件夹内子目录总数的计数。就我而言,我想省略任何名为.git的子目录(以及可能嵌套在这些.git文件夹中的所有文件夹)。

在Python 3.6.7中,我发现接受的答案的方法不起作用-它计算了所有.git文件夹及其子文件夹。这是对我有用的东西:

num_local_subdir = 0
for root, dirs, files in os.walk(local_folder_path):
    if '.git' in dirs:
        dirs.remove('.git')
    num_local_subdir += (len(dirs))