Python 返回目录中所有文件的列表

Python 返回目录中所有文件的列表,python,python-3.x,Python,Python 3.x,我还在学习python的入门课程。我正在尝试编写一个程序,使用递归返回目录中所有文件名的列表,但由于某些原因,它无法按预期工作。这是我的密码:谢谢 from pathlib import Path p = Path('/Users/name/Documents/') def directory_files (dirct: Path) -> list: Lf = [] if dirct.is_file: Lf.append(dirct) else:

我还在学习python的入门课程。我正在尝试编写一个程序,使用递归返回目录中所有文件名的列表,但由于某些原因,它无法按预期工作。这是我的密码:谢谢

from pathlib import Path
p = Path('/Users/name/Documents/')

def directory_files (dirct: Path) -> list:
    Lf = []
    if dirct.is_file:
        Lf.append(dirct)
    else:
        for d in list(dirct.iterdir()):
            directory_files(d)

    return Lf

您忘记调用
is_file
,如果您想用文件填充列表,您需要检查
dirct
是否是目录,不是文件并不意味着它是目录。您还可以简单地扩展每个元素上的递归列表:

def directory_files(dirct: Path) -> list:
    Lf = []
    if dirct.is_dir():
        for d in dirct.iterdir():
            Lf.extend(directory_files(d))
    else:
        Lf.append(dirct)   
    return Lf
演示:

如果只需要名称,请使用.name属性:

def directory_files (dirct: Path) -> list:
    Lf = []
    if dirct.is_dir():
        for d in dirct.iterdir():
            Lf.extend(directory_files(d))
    else:
        Lf.append(dirct.name)
    return Lf
演示:

is\u file
就像
is\u dir
是需要调用的方法一样,
if dirct.is\u file
正在检查dirct.is\u file是否引用了方法is
True
始终是这样,paren
is\u file()
实际上调用了方法,然后返回一个布尔值

如果要明确检查文件,还需要添加一个
is_文件
,例如,命名管道不是目录,但不会通过
is_文件
测试,因此:

def directory_files(dirct: Path) -> list:
    Lf = []
    if dirct.is_dir():
        for d in dirct.iterdir():
            Lf.extend(directory_files(d))
    elif dirct.is_file():
        Lf.append(dirct.name)
    return Lf
您可以看到输出中的差异:

In [27]: ls
bar.txt  foo_pipe|  foo.txt  test2/

In [28]: p = Path(".")

In [29]: directory_files1(p)  # has if dirct.is_file()
Out[29]: 
[PosixPath('foo.txt'),
 PosixPath('bar.txt'),
 PosixPath('test2/bar2.txt'),
 PosixPath('test2/foo2.txt')]

In [30]: directory_files(p)
Out[30]: 
[PosixPath('foo.txt'),
 PosixPath('bar.txt'),
 PosixPath('test2/bar2.txt'),
 PosixPath('test2/foo2.txt'),
 PosixPath('foo_pipe')]
您可能会发现一个很好的工具来帮助您理解递归,它可以创建一个图形,其中:

这些边按照执行过程遍历它们的顺序进行编号。2.边缘颜色从黑色到灰色,以指示遍历顺序:首先是黑色边缘,最后是灰色边缘


在这里看有点困难,但如果你点击图像,应该会更容易看到。

@erip:我应该把返回目录文件(d)放在哪里?这里的问题是你忘记保存递归调用的结果,另外,
is_file
是一个函数,所以你必须调用它才能知道它是否是文件。你建议使用
isfile
,然后不要使用它。@erip:他不建议使用
is_file
,他说问题是没有调用它……而且它仍然不在这段代码中
isfile
os
中,顺便说一下,OP没有使用它。您正在搜索的
是\u文件
。同意。向下投票是因为你对OP问题的回答是错误的,而不是。OP没有“忘记调用
isfile
”;OP忘记调用
is_file()
。然后,你继续给出一个与OP的原始代码完全不同的解决方案,而没有告诉他为什么他应该用你的方式来代替。@PadraicCunningham:他不必要地迂腐,因为你写了
isfile
是你的答案,而不是
isu file
def directory_files(dirct: Path) -> list:
    Lf = []
    if dirct.is_dir():
        for d in dirct.iterdir():
            Lf.extend(directory_files(d))
    elif dirct.is_file():
        Lf.append(dirct.name)
    return Lf
In [27]: ls
bar.txt  foo_pipe|  foo.txt  test2/

In [28]: p = Path(".")

In [29]: directory_files1(p)  # has if dirct.is_file()
Out[29]: 
[PosixPath('foo.txt'),
 PosixPath('bar.txt'),
 PosixPath('test2/bar2.txt'),
 PosixPath('test2/foo2.txt')]

In [30]: directory_files(p)
Out[30]: 
[PosixPath('foo.txt'),
 PosixPath('bar.txt'),
 PosixPath('test2/bar2.txt'),
 PosixPath('test2/foo2.txt'),
 PosixPath('foo_pipe')]