仅列出当前目录中的文件。

322

在Python中,我只想列出当前目录下的所有文件,而不是列出任何子目录或父目录中的文件。

看起来有类似的解决方案,但它们对我似乎无效。以下是我的代码片段:

import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

假设我有两个文件,holygrail.py和Tim在当前目录中。我还有一个文件夹,里面包含两个文件——让我们称之为Arthur和Lancelot。当我运行脚本时,我会得到这个:

holygrail.py
Tim
Arthur
Lancelot

我对 holygrail.py 和 Tim 感到满意。但是,我不想列出 Arthur 和 Lancelot 这两个文件。

10个回答

535

使用 os.listdiros.path.isfile 代替 os.walk

示例:

import os
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
    # do something

但是当将此应用于其他目录时要小心,例如:

files = [f for f in os.listdir(somedir) if os.path.isfile(f)]

之所以不起作用,是因为f不是完整路径,而是相对于当前目录的。

因此,如果要在另一个目录上进行过滤,请使用os.path.isfile(os.path.join(somedir, f))

(感谢Causality提供提示)


9
最终我需要的是 [os.path.join(path_base,f) for f in os.listdir(path_base) if os.path.isfile(os.path.join(path_base,f))] 这段代码。 - citynorman
5
这是他的答案:files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))] - Jeff Luyet

90
你可以使用os.listdir来实现这个目的。如果你只需要文件而不是目录,你可以使用os.path.isfile过滤结果。
例子:
files = os.listdir(os.curdir)  #files and directories

或者

files = filter(os.path.isfile, os.listdir( os.curdir ) )  # files only
files = [ f for f in os.listdir( os.curdir ) if os.path.isfile(f) ] #list comprehension version.

我认为过滤器版本只在当前目录下有效。例如,对于 files = filter(os.path.isfile, os.listdir(anyFolderPath)),它不起作用。 - Paul Sumpner

30
import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]

5
感谢您提供了通用解决方案(针对dir不是cwd的情况)。 - jwg
有没有办法让文件时间戳也成为输出的一部分? - Ammad

19

你可以使用os.scandir()。这是Python 3.5中标准库的新函数。

import os

for entry in os.scandir('.'):
    if entry.is_file():
        print(entry.name)

os.walk()os.listdir()更快。 os.walk()实现了os.scandir()(查看说明)


15
你可以使用 pathlib 模块。
from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))

这在使用pathlib.Path时非常有用。通常我使用pathlib.Path。非常感谢。 - Uzzal Podder
1
使用早期解决方案中涵盖的 os 模块是可以的,但应该强调开始整合更易于使用的模块,如 globpathlib - Austin A

7
这可以通过使用os.walk()函数来完成。
Python 3.5.2已测试。
import os
for root, dirs, files in os.walk('.', topdown=True):
    dirs.clear() #with topdown true, this will prevent walk from going into subs
    for file in files:
      #do some stuff
      print(file)

请移除dirs.clear()这一行,这样子文件夹中的文件就会被重新包含在内。

更新内容并附上参考资料

os.walk在此文档中有所记录,讨论了三元列表的创建和自上而下的影响。

.clear()在此处有所记录,用于清空列表。

因此,通过清除os.walk相关的列表,您可以将其结果影响到您的需求上。


5
import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

你可以通过添加del dirs[:]来改进这段代码,代码如下所示。
import os
for subdir, dirs, files in os.walk('./'):
    del dirs[:]
    for file in files:
      do some stuff
      print file

甚至更好的是,您可以将os.walk指向当前工作目录。
import os
cwd = os.getcwd()
for subdir, dirs, files in os.walk(cwd, topdown=True):
    del dirs[:]  # remove the sub directories.
    for file in files:
      do some stuff
      print file

3

不要使用os.walk,而是直接使用os.listdir


1

在 Pygirl 和 Flimm 的基础上,使用 pathlib(非常有用的参考资料),他们的解决方案包括结果中的完整路径,因此这里提供一个仅输出文件名的解决方案:

from pathlib import Path
p = Path(destination_dir) # destination_dir = './' in original post
files = [x.name for x in p.iterdir() if x.is_file()]
print(files)

0

使用 os.walk 列出特定文件夹中不包括其子文件夹中的文件:

_, _, file_list = next(os.walk(data_folder))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接