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

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

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

所以这里是我的问题:是否有一个现有的函数,执行os.listdir()时忽略隐藏的文件,如果不是什么将是最好的方式?

谢谢。

你可以自己写一个:

 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, '*')) 

其中任何一个都将忽略以'.'开始的所有文件名'.'

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

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

作为一个侧面说明,文档状态listdir将以“任意顺序”返回结果,但常见的用例是按字母顺序sorting。 如果您要将目录内容按字母顺序sorting,而不考虑大小写,则可以使用:

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

在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 
 filter( lambda f: not f.startswith('.'), os.listdir('.')) 

glob :

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

glob声明使用listdirfnmatch在引擎盖下,但它也检查领先的'.' ,而不是使用fnmatch 。)