如何在使用os.listdir()时忽略隐藏文件?

128 投票
8 回答
144600 浏览
提问于 2025-04-16 23:49

我有一个Python脚本,它执行了一个os.listdir(path),这个路径是一个包含我需要逐个处理的档案的队列。

问题是,我得到的列表是一个数组,然后我只是简单地用array.pop(0)来取出第一个元素。之前一切都很好,直到我把项目放到版本控制系统Subversion里。现在我的数组里出现了.svn这个文件夹,当然这让我的应用程序崩溃了。

所以我想问:有没有什么函数可以在执行os.listdir()时忽略隐藏文件?如果没有,最好的解决办法是什么呢?

8 个回答

30

在Windows、Linux和OS X系统上:

if os.name == 'nt':
    import win32api, win32con


def folder_is_hidden(p):
    if os.name== 'nt':
        attribute = win32api.GetFileAttributes(p)
        return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM)
    else:
        return p.startswith('.') #linux-osx
74

这是一个老问题,但似乎缺少了一个显而易见的答案,就是使用列表推导式,所以我在这里补充一下:

[f for f in os.listdir(path) if not f.startswith('.')]

顺便提一下,文档中说明 listdir 返回的结果是“任意顺序”,但一个常见的用法是希望它们按字母顺序排列。如果你想要目录内容按字母顺序排列,并且不考虑大小写,可以使用:

sorted((f for f in os.listdir() if not f.startswith(".")), key=str.lower)

(已编辑为使用 key=str.lower,而不是 lambda

144

你可以自己写一个:

import os

def listdir_nohidden(path):
    for f in os.listdir(path):
        if not f.startswith('.'):
            yield f

或者你可以使用一个叫做 glob 的工具:

import glob
import os

def listdir_nohidden(path):
    return glob.glob(os.path.join(path, '*'))

这两种方法都会忽略所有以 '.' 开头的文件名。

撰写回答