如何在使用os.listdir()时忽略隐藏文件?
我有一个Python脚本,它执行了一个os.listdir(path)
,这个路径是一个包含我需要逐个处理的档案的队列。
问题是,我得到的列表是一个数组,然后我只是简单地用array.pop(0)
来取出第一个元素。之前一切都很好,直到我把项目放到版本控制系统Subversion里。现在我的数组里出现了.svn
这个文件夹,当然这让我的应用程序崩溃了。
所以我想问:有没有什么函数可以在执行os.listdir()
时忽略隐藏文件?如果没有,最好的解决办法是什么呢?
8 个回答
30
在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
74
这是一个老问题,但似乎缺少了一个显而易见的答案,就是使用列表推导式,所以我在这里补充一下:
[f for f in os.listdir(path) if not f.startswith('.')]
顺便提一下,文档中说明 listdir
返回的结果是“任意顺序”,但一个常见的用法是希望它们按字母顺序排列。如果你想要目录内容按字母顺序排列,并且不考虑大小写,可以使用:
sorted((f for f in os.listdir() if not f.startswith(".")), key=str.lower)
(已编辑为使用 key=str.lower
,而不是 lambda
)
144
你可以自己写一个:
import os
def listdir_nohidden(path):
for f in os.listdir(path):
if not f.startswith('.'):
yield f
或者你可以使用一个叫做 glob 的工具:
import glob
import os
def listdir_nohidden(path):
return glob.glob(os.path.join(path, '*'))
这两种方法都会忽略所有以 '.'
开头的文件名。