我的python脚本执行一个os.listdir(path)
,其中路径是一个包含我需要逐个处理的档案的队列。如何使用os.listdir()忽略隐藏的文件?
问题是,我得到一个数组中的列表,然后我只是做一个简单的array.pop(0)
。它工作正常,直到我把该项目颠覆。现在我得到我的数组中的.svn
文件夹,当然这会让我的应用程序崩溃。
因此,这里是我的问题:执行os.listdir()
时是否存在忽略隐藏文件的现有函数?如果不是,最好的方法是什么?
谢谢。
我的python脚本执行一个os.listdir(path)
,其中路径是一个包含我需要逐个处理的档案的队列。如何使用os.listdir()忽略隐藏的文件?
问题是,我得到一个数组中的列表,然后我只是做一个简单的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, '*'))
其中之一将忽略所有以'.'
开头的文件名。
在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
也应该在Mac上工作,隐藏文件以'。'开始。以及。 –
这是唯一的可移植的答案,很好的工作,但其他答案提供了一个完整的os.listdir包装,所以......'[f for f在os.listdir(路径)如果不是folder_is_hidden(f)]' – SensorSmith
filter(lambda f: not f.startswith('.'), os.listdir('.'))
这是一个老问题,但好像它缺少使用列表理解的显而易见的答案,所以我在这里将它完整性:
[f for f in os.listdir(path) if not f.startswith('.')]
作为一个侧面说明,文档状态listdir
将返回“任意顺序”,但一个共同的用例的结果是让他们按字母顺序排序。如果你想按字母顺序排序而不考虑市值目录内容,你可以使用:
sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
所提出的功能'listdir_nohidden'是不是'os.listdir'很好地兼容,因为使用yield'的'使其成为发电机。相反,它应该从'os.listdir'的输出列表中运行,并删除以'。'开头的条目。 – 0sh
@ 0sh:为什么它必须删除东西?只需定义一个新的函数,该函数执行'list(listdir_nohidden(path))',并且该新函数与'os.listdir'完全兼容。 – abarnert