如何在os.listdir中查找文件并跳过目录


问题内容

我使用os.listdir并且运行良好,但是列表中也有子目录,这不是我想要的:我只需要文件。

我需要使用什么功能?

我也看了看os.walk,似乎是我想要的,但是我不确定它是如何工作的。


问题答案:

您需要过滤掉目录;os.listdir()列出给定路径中的所有 名称
。您可以os.path.isdir()为此使用:

basepath = '/path/to/directory'
for fname in os.listdir(basepath):
    path = os.path.join(basepath, fname)
    if os.path.isdir(path):
        # skip directories
        continue

请注意,这仅在以下符号链接之后 过滤掉目录fname不一定是 常规文件
,也可以是文件的符号链接。如果还需要过滤掉符号链接,则需要先使用not os.path.islink()

在现代的Python版本(3.5或更高版本)上,更好的选择是使用os.scandir()函数;这产生DirEntry()实例。在通常情况下,这更快,因为加载的Direntry已经缓存了足够的信息来确定条目是否为目录:

basepath = '/path/to/directory'
for entry in os.scandir(basepath):
    if entry.isdir():
        # skip directories
        continue
    # use entry.path to get the full path of this entry, or use
    # entry.name for the base filename

entry.is_file(follow_symlinks=False)如果仅需要常规文件(而无需符号链接),则可以使用。

os.walk()在后台进行相同的工作;除非您需要递归向下的子目录,否则无需在os.walk()此处使用。