【问题标题】:os.walk without hidden foldersos.walk 没有隐藏文件夹
【发布时间】:2012-11-19 12:48:23
【问题描述】:

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

但是,它也列出了隐藏的文件夹和文件。我希望我的应用程序不列出任何隐藏的文件夹或文件。有没有什么标志可以用来让它不产生任何隐藏文件?

跨平台对我来说不是很重要,如果它只适用于linux(.*模式)就可以了

【问题讨论】:

  • 你在哪个平台上? “隐藏”在不同的操作系统上有不同的含义。
  • 我在 linux 上,我会在答案中添加。

标签: python linux os.walk


【解决方案1】:

不,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 时,调用者可以就地修改目录名列表(可能使用del 或切片赋值),而walk() 只会递归到名称保留在 中的子目录目录名;这可用于修剪搜索、强制执行特定的访问顺序,甚至在调用者再次恢复 walk() 之前通知 walk() 有关调用者创建或重命名的目录。

【讨论】:

  • 非常感谢,不知道可以原地修改列表!
  • @user5359531:这完全取决于您的用例;你可以print '\n'.join([os.path.join(root, f) for f in dirs + files])
  • Wander 可以files = [f for f in files if not f[0] == '.'] 写成files[:] = [f for f in files if not f[0] == '.'],就像dirs[:] 一样?
  • @linrongbin:你可以,但这没有任何优势。 files = [...]files 绑定到一个新列表,files[:] = [...] 替换列表中 files 已绑定的元素。当os.walk() 将它提供给您时,没有其他代码正在使用该列表。另一方面,dirsos.walk() 用于查找下一个要为其生成文件的目录,因此如果您使用dirs[:] = [...],那么以. 开头的目录仍然会被访问。
  • @linrongbin:另请参阅nedbatchelder.com/text/names.html 以了解 Python 变量的工作原理;这将有助于了解os.walk() 实现和dir[:] = [...] 的交互方式。
【解决方案2】:

我意识到问题中没有提出这个问题,但我遇到了类似的问题,我想排除隐藏文件和以 __ 开头的文件,特别是 __pycache__ 目录。我提出这个问题是因为我试图弄清楚为什么我的列表理解没有达到我的预期。我没有用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)]

【讨论】:

  • 这是一个很好的答案,非常适合根据列表进行排除
  • 仅供参考,startswith 也可以采用字符串元组,因此您可以摆脱内部 for 循环,只需使用 not dirname.startswith(exclude_prefixes) docs.python.org/2/library/stdtypes.html#str.startswith(python 2.5 及更高版本)
【解决方案3】:

我的用例类似于 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多