2012-11-19 49 views
25

我需要列出文件夹中包含目录路径的所有文件。我试图使用os.walk,这显然是完美的解决方案。os.walk不带隐藏文件夹

但是,它也列出隐藏的文件夹和文件。我希望我的应用程序不要列出任何隐藏的文件夹或文件。有没有可以用来使其不产生任何隐藏文件的标志?

跨平台是不是我真的很重要,它的确定,如果它仅适用于Linux操作系统(。*模式)

+1

什么平台是你吗? “隐藏”在不同的操作系统上有不同的含义。 –

+0

我在Linux上,我会在答案中加上。 – lolopop

回答

56

没有,有没有选择os.walk()那将跳过这些。你需要做自己(这是很容易的):

for root, dirs, files in os.walk(path): 
    files = [f for f in files if not f[0] == '.'] 
    dirs[:] = [d for d in dirs if not d[0] == '.'] 
    # use files and dirs 

注意dirs[:] =片分配;我们将替换元素中的dirs(而不是dirs引用的列表),以便os.walk()不会处理删除的目录。

topdownTrue,调用者可以修改就地dirnames中列表(可能使用del或切片分配):

这仅如果保持topdown关键字参数True,从documentation of os.walk()工作,并且walk()只会递归到名称保持为dirnames的子目录中;这可以用来修剪搜索,施加特定的访问顺序,或者甚至在它再次恢复walk()之前通知walk()关于呼叫者创建或重命名的目录。

+0

非常感谢,不知道你可以修改这个列表! – lolopop

+0

我跑这个,但它没有打印任何东西到控制台。以这种方式显示文件的典型方法是什么?我在最后添加了“print root,dirs,files”,但它非常混乱。 – user5359531

+1

@ user5359531:完全取决于您的用例;你可以'print'\ n'.join([os.path.join(root,f)for dirs + files])'等。 –

5

我意识到这不是在问问题,但我有我想要的地方都排除隐藏文件和文件__开始,特别是__pycache__目录类似的问题。我着手解决这个问题,因为我试图弄清楚为什么我的列表理解不符合我的预期。我没有用dirnames[:]修改这个列表。

我创建前缀我想排除列表,并修改了dirnames中的地方,像这样:

exclude_prefixes = ('__', '.') # exclusion prefixes 
    for dirpath, dirnames, filenames in os.walk(node): 
     # exclude all dirs starting with exclude_prefixes 
     dirnames[:] = [dirname 
         for dirname in dirnames 
         if not dirname.startswith(exclude_prefixes)] 
+0

这是一个很好的答案,完美适用于根据列表排除 – jpwynn

+1

仅供参考,'startswith'也可以带一个字符串元组,因此您可以摆脱inner for循环,只需使用'not dirname.startswith(exclude_prefixes)'https://docs.python.org/2/library/stdtypes .html#str.startswith(python 2.5及更高版本) –