如何在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()
此处使用。