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

tal*_*las 71 python hidden-files

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

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

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

谢谢.

Ada*_*eld 83

你可以自己写一个:

def listdir_nohidden(path):
    for f in os.listdir(path):
        if not f.startswith('.'):
            yield f
Run Code Online (Sandbox Code Playgroud)

或者你可以使用glob:

def listdir_nohidden(path):
    return glob.glob(os.path.join(path, '*'))
Run Code Online (Sandbox Code Playgroud)

这些中的任何一个都将忽略以...开头的所有文件名'.'.

  • @ 0sh:为什么必须就地移除东西?只需定义一个执行`list(listdir_nohidden(path))`的新函数,并且新函数与`os.listdir`完全兼容. (2认同)

Jos*_*ker 36

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

[f for f in os.listdir(path) if not f.startswith('.')]
Run Code Online (Sandbox Code Playgroud)

作为旁注,文档状态listdir将以"任意顺序"返回结果,但常见的用例是按字母顺序排序.如果您希望按字母顺序对目录内容进行排序而不考虑大写,则可以使用:

sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
Run Code Online (Sandbox Code Playgroud)

  • key = lambda f:f.lower()可以不带lambda来编写:key = str.lower (3认同)
  • 结合两者:`sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.lower)` (2认同)

小智 16

在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
Run Code Online (Sandbox Code Playgroud)

  • 也应该在Mac上运行,隐藏文件以"."开头.同样. (2认同)
  • 这是唯一可移植的答案,干得好,但其他答案为 os.listdir 提供了一个完整的包装,所以......`[f for f in os.listdir(path) if not folder_is_hidden(f)]` (2认同)

Jos*_*Lee 13

glob:

>>> import glob
>>> glob.glob('*')
Run Code Online (Sandbox Code Playgroud)

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


scu*_*cum 12

filter( lambda f: not f.startswith('.'), os.listdir('.'))
Run Code Online (Sandbox Code Playgroud)


use*_*227 6

我认为一个循环遍历所有项目的工作量太大。我希望这样简单一些:

lst = os.listdir(path)
if '.DS_Store' in lst:
    lst.remove('.DS_Store')
Run Code Online (Sandbox Code Playgroud)

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

all_files = os.popen('ls -1').read()
lst = all_files.split('\n')
Run Code Online (Sandbox Code Playgroud)

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

import glob
glob.glob('*')
Run Code Online (Sandbox Code Playgroud)