47

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

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

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

4

3 回答 3

106

不,没有选项可以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关键字参数保留为True, 的文档中os.walk()才有效:

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

于 2012-11-19T12:54:02.693 回答
13

我意识到这个问题没有被问到,但我有一个类似的问题,我想排除隐藏文件和以 开头的文件__,特别是__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)]
于 2014-08-11T15:24:15.340 回答
2

我的用例类似于 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))
于 2019-05-29T20:48:24.673 回答