Python 返回目录中所有文件的列表
我还在学习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:
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是否引用了方法isTrue
始终是这样,parenis\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')]