Python中获取类似于"find ."的最简单方法是什么?

19

如何使用Python获取一个文件夹中所有文件的递归列表?我知道可以使用os.walk(),但它似乎过于复杂只是为了获取未经筛选的所有文件列表。难道这是唯一的选择吗?


这个回答解决了你的问题吗?Python递归子文件夹搜索并返回文件列表 - Tomerikoo
7个回答

19

没有任何阻止你创建自己的函数:

import os

def listfiles(folder):
    for root, folders, files in os.walk(folder):
        for filename in folders + files:
            yield os.path.join(root, filename)

你可以这样使用它:

for filename in listfiles('/etc/'):
    print filename

谢谢!我只是想确认这个函数是否已经是标准库的一部分。 - static_rtti
不错的解决方案!但是 find . 也会列出目录。不过修复非常容易。 :) - Lauritz V. Thaulow

13

os.walk()绝不是过度使用。它可以在一瞬间生成您的文件和目录列表:

files = [os.path.join(dirpath, filename)
    for (dirpath, dirs, files) in os.walk('.')
    for filename in (dirs + files)]
你可以将它转换为生成器,以便一次只处理一个路径并节省内存。

3

你还可以使用Python中的find程序本身,通过使用sh来实现。

import sh
text_files = sh.find(".", "-iname", "*.txt")

顺便说一下,sh不是内置命令。我以为它是因为听起来很熟悉。 - Noumenon

2

pathlib.Path.rglob 很简单。它列出了整个目录树。

(参数是文件路径的搜索模式。"*" 意味着列出所有内容)

import pathlib


for path in pathlib.Path("directory_to_list/").rglob("*"):
    print(path)

1

os.walk()难以使用,建议放弃并使用pathlib代替。

这里有一个Python函数,类似于R语言中的list.files函数。

def list_files(path,pattern,full_names=False,recursive=True):
    if(recursive):
        files=pathlib.Path(path).rglob(pattern)
    else:
        files=pathlib.Path(path).glob(pattern)

    if full_names:
        files=[str(f) for f in files]
    else:
        files=[f.name for f in files]
    return(files)

1
import os
path = "path/to/your/dir"
for (path, dirs, files) in os.walk(path):
    print files

这是过度设计了吗,还是我漏掉了什么?


你说得完全正确。它看起来比实际上要困难得多。 - Hans Then

1
要么使用 isdir() / isfile()listdir() 进行手动递归,要么使用 subprocess.check_output() 并调用 find .。基本上,os.walk() 是最高级别的,稍微低一级的是基于 listdir() 的半手动解决方案,如果你想要与 find . 相同的输出,出于某种原因,你可以使用 subprocess 进行系统调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接