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

时间:2015-12-22 15:13:18

标签: 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:
        for d in list(dirct.iterdir()):
            directory_files(d)

    return Lf

1 个答案:

答案 0 :(得分:4)

您忘了拨打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

演示:

In [6]: ls
bar.txt  foo.txt  test2/

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

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

如果您只想使用.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

演示:

In [10]: directory_files(p)
Out[10]: ['foo.txt', 'bar.txt', 'bar2.txt', 'foo2.txt']
is_file这样的is_dir是需要调用的方法,if dirct.is_file正在检查对方法的引用是dirct.is_fileTrue总是这样,parens is_file()实际上调用了方法,然后返回一个布尔值。

如果要显式检查文件,还需要添加is_file,例如命名管道不是目录,但不会通过is_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')]

您可能会发现rcviz是一个很好的工具,可以帮助您理解递归,它可以创建一个图表:

边缘按执行遍历它们的顺序编号。 2.边缘从黑色变为灰色,表示遍历顺序:首先是黑色边缘,最后是灰色边缘。

enter image description here

这里有点难以看到,但是如果你点击图片就可以让它更容易看到。