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

2024-09-27 21:22:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我还在上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

Tags: pathfrom程序目录密码列表文件名原因
1条回答
网友
1楼 · 发布于 2024-09-27 21:22:55

你忘了调用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_fileis_dir一样,都是需要调用的方法,if dirct.is_file正在检查作为方法引用的dirct.is_file是否是True,这总是这样,paren 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

这是一个有点难以看到这里,但如果你点击图像,它应该使它更容易看到。你知道吗

相关问题 更多 >

    热门问题