我还在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
答案 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_file
是True
总是这样,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.边缘从黑色变为灰色,表示遍历顺序:首先是黑色边缘,最后是灰色边缘。
这里有点难以看到,但是如果你点击图片就可以让它更容易看到。