2011-08-17 629 views
49

我的python脚本执行一个os.listdir(path),其中路径是一个包含我需要逐个处理的档案的队列。如何使用os.listdir()忽略隐藏的文件?

问题是,我得到一个数组中的列表,然后我只是做一个简单的array.pop(0)。它工作正常,直到我把该项目颠覆。现在我得到我的数组中的.svn文件夹,当然这会让我的应用程序崩溃。

因此,这里是我的问题:执行os.listdir()时是否存在忽略隐藏文件的现有函数?如果不是,最好的方法是什么?

谢谢。

回答

60

你可以写一个自己:

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

或者您可以使用glob

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

其中之一将忽略所有以'.'开头的文件名。

+1

所提出的功能'listdir_nohidden'是不是'os.listdir'很好地兼容,因为使用yield'的'使其成为发电机。相反,它应该从'os.listdir'的输出列表中运行,并删除以'。'开头的条目。 – 0sh

+1

@ 0sh:为什么它必须删除东西?只需定义一个新的函数,该函数执行'list(listdir_nohidden(path))',并且该新函数与'os.listdir'完全兼容。 – abarnert

10

glob

>>> import glob 
>>> glob.glob('*') 

glob声称使用listdirfnmatch引擎盖下,但它也检查前置'.',不使用fnmatch

13

在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 
+2

也应该在Mac上工作,隐藏文件以'。'开始。以及。 –

+0

这是唯一的可移植的答案,很好的工作,但其他答案提供了一个完整的os.listdir包装,所以......'[f for f在os.listdir(路径)如果不是folder_is_hidden(f)]' – SensorSmith

12
filter(lambda f: not f.startswith('.'), os.listdir('.')) 
13

这是一个老问题,但好像它缺少使用列表理解的显而易见的答案,所以我在这里将它完整性:

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

作为一个侧面说明,文档状态listdir将返回“任意顺序”,但一个共同的用例的结果是让他们按字母顺序排序。如果你想按字母顺序排序而不考虑市值目录内容,你可以使用:

sorted([f for f in os.listdir('./')], key=lambda f: f.lower()) 
0
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))