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

时间:2011-08-17 20:48:51

标签: python hidden-files

我的python脚本执行os.listdir(path),其中路径是包含我需要逐个处理的档案的队列。

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

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

谢谢。

7 个答案:

答案 0 :(得分:77)

你可以自己写一个:

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 :(得分:26)

这是一个老问题,但似乎缺少使用列表理解的明显答案,所以我在这里添加它是为了完整性:

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

作为旁注,文档状态listdir将以“任意顺序”返回结果,但常见的用例是按字母顺序排序。如果您希望按字母顺序对目录内容进行排序而不考虑大写,则可以使用:

sorted([f for f in os.listdir('./')], key=lambda f: f.lower())

答案 2 :(得分:16)

在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

答案 3 :(得分:12)

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

答案 4 :(得分:11)

glob

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

glob声称可以使用listdirfnmatch,但它也会检查前导'.',而不是使用fnmatch。)

答案 5 :(得分:6)

我认为循环中的所有项目都是太多的工作。我更喜欢这样简单的东西:

lst = os.listdir(path)
if '.DS_Store' in lst:
    lst.remove('.DS_Store')

答案 6 :(得分:1)

let image : UIImage = UIImage(data: filteredAry[indexPath.row] as! Data)

cell2.dataimage.image = image