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


87

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

问题是,我将列表放入数组中,然后执行一个简单的array.pop(0)。直到我将项目置于颠覆状态之前,一切都很好。现在,我将.svn文件夹保存在数组中,这当然会使应用程序崩溃。

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

Answers:


102

您可以自己写一个:

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并删除以“。”开头的条目。
Milo Wielondek'3

3
@ 0sh:为什么必须就地删除内容?只需定义一个新函数即可,list(listdir_nohidden(path))并且该新函数与完全兼容os.listdir
13年

47

这是一个古老的问题,但似乎缺少使用列表理解的明显答案,因此为了完整性起见,我在此处添加它:

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

附带说明一下,docs状态listdir将以“任意顺序”返回结果,但常见的用例是按字母顺序对结果进行排序。如果希望目录内容按字母顺序排序而不考虑大小写,则可以使用:

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

5
key=lambda f: f.lower():可以写不拉姆达key=str.lower
让·弗朗索瓦·法布尔

2
结合两者:sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.lower)
罗伯特·

18

在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上使用,隐藏文件以“。”开头。也一样
Verena Haunschmid 2013年

2
这是唯一可移植的答案,很不错,但是其他答案为os.listdir提供了完整的包装,因此……[f for f in os.listdir(path) if not folder_is_hidden(f)]
SensorSmith


14

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

glob声称可以使用listdir并且fnmatch在后台使用,但它也可以检查引线,而'.'不是通过使用fnmatch。)


6

我认为,要循环浏览所有项目的工作量太大。我希望这样简单一些:

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

如果该目录包含多个隐藏文件,则可以帮助您:

all_files = os.popen('ls -1').read()
lst = all_files.split('\n')

对于平台独立性,如@Josh提到的glob效果很好:

import glob
glob.glob('*')

仅当您拥有一个隐藏文件并且知道文件名时,该方法才有效。如果目录包含数十个隐藏文件,它们具有您事先不知道的任意名称,该怎么办?
FeRD '19

嗨@FeRD,是的。在Mac上进行批处理/积压处理时,我将所有文件放在新文件夹中并.DS_Store自动创建。当我压缩所有文件并将其推送到服务器时,.DS_Store也会被添加。如果有各种隐藏文件,则可以尝试os.system('ls -1')
用户923227 '19

不是跨平台的。os.popen('ls -1').read()在Windows上将无法使用。这就是重点os.listdir()
FeRD '19

1
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.