我的python脚本执行一个os.listdir(path)路径,该路径是一个队列,其中包含我需要一一对待的档案。
问题是,我将列表放入数组中,然后执行一个简单的array.pop(0)。直到我将项目置于颠覆状态之前,一切都很好。现在,我将.svn文件夹保存在数组中,这当然会使应用程序崩溃。
所以这是我的问题:是否有一个函数在执行时会忽略隐藏文件os.listdir(),如果不是,那是最好的方法?
Answers:
这是一个古老的问题,但似乎缺少使用列表理解的明显答案,因此为了完整性起见,我在此处添加它:
[f for f in os.listdir(path) if not f.startswith('.')]
附带说明一下,docs状态listdir将以“任意顺序”返回结果,但常见的用例是按字母顺序对结果进行排序。如果希望目录内容按字母顺序排序而不考虑大小写,则可以使用:
sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
    key=lambda f: f.lower():可以写不拉姆达key=str.lower
                    sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.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
    [f for f in os.listdir(path) if not folder_is_hidden(f)]
                    Joshmaker为您的问题提供了正确的解决方案。
如何使用os.listdir()忽略隐藏文件?
但是,在Python 3中,建议使用pathlib而不是os。
from pathlib import Path 
visible_files = [
    file for file in Path(".").iterdir() if not file.name.startswith(".")
]
    我认为,要循环浏览所有项目的工作量太大。我希望这样简单一些:
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('*')
    .DS_Store自动创建。当我压缩所有文件并将其推送到服务器时,.DS_Store也会被添加。如果有各种隐藏文件,则可以尝试os.system('ls -1')
                    os.popen('ls -1').read()在Windows上将无法使用。这就是重点os.listdir()。
                    
listdir_nohidden与不太兼容os.listdir,因为使用yield使其成为生成器。相反,它应在输出列表中运行,os.listdir并删除以“。”开头的条目。