107

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

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

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

4

8 回答 8

125

你可以自己写一个:

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

其中任何一个都将忽略所有以'.'.

于 2011-08-17T20:53:33.933 回答
62

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

[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而不是 a lambda

于 2014-10-24T19:27:46.570 回答
24

在 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
于 2012-12-28T00:26:46.293 回答
16

Joshmaker 为您的问题提供了正确的解决方案。
如何使用 os.listdir() 忽略隐藏文件?

然而,在 Python 3 中,建议使用 pathlib 而不是 os。

from pathlib import Path 
visible_files = [
    file for file in Path(".").iterdir() if not file.name.startswith(".")
]
于 2013-04-29T22:29:51.673 回答
15

全局

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

glob声称使用listdirfnmatch在引擎盖下,但它也检查前导'.',而不是使用fnmatch。)

于 2011-08-17T20:51:19.600 回答
7

我认为循环遍历所有项目的工作量太大。我更喜欢像这样更简单的东西:

lst = os.listdir(path)
if '.DS_Store' in lst:
    lst.remove('.DS_Store')

如果目录包含多个隐藏文件,那么这会有所帮助:

all_files = os.popen('ls -1').read()
lst = all_files.split('\n')

对于平台独立性,@Josh 提到 glob 运行良好:

import glob
glob.glob('*')
于 2018-05-18T18:04:23.363 回答
1
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
于 2017-12-09T05:15:46.567 回答
0

您可以只使用一个简单的 for 循环,该循环将排除任何具有“。”的文件或目录。在前面。

专业人士代码:

import os

directory_things = [i for i in os.listdir() if i[0] != "."] # Exclude all with . in the start

菜鸟代码

items_in_directory = os.listdir()
final_items_in_directory = []

for i in items_in_directory:
    if i[0] != ".": # If the item doesn't have any '.' in the start
        final_items_in_directory.append(i)
于 2021-09-20T12:11:13.623 回答