如何使用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
声明使用listdir
和fnmatch
在引擎盖下,但它也检查领先的'.'
,而不是使用fnmatch
。)