仅列出目录中的文件?

64

有没有一种方法可以使用Python列出目录中的文件(而不是目录)?我知道我可以使用os.listdir和一个os.path.isfile()循环,但如果有更简单的方法(比如一个名为os.path.listfilesindir的函数),那就更好了。


related - tshepang
8个回答

74

下面是一个简单的生成器表达式

files = (file for file in os.listdir(path) 
         if os.path.isfile(os.path.join(path, file)))
for file in files: # You could shorten this to one line, but it runs on a bit.
    ...

如果你觉得更适合的话,你也可以创建一个生成器函数:

def files(path):
    for file in os.listdir(path):
        if os.path.isfile(os.path.join(path, file)):
            yield file

然后只需:
for file in files(path):
    ...

您忘记在dirname和filename之间添加join了。 - ayvango
@ayvango 这只是一种不同的行为方式 - 在问题中没有要求提供完整路径,而这种方式可以按照明确定义的方式正常工作。 - Gareth Latty
os.listdir返回文件的基本名称,如果您的当前目录与给定路径匹配,则只需按基本名称直接对它们进行统计。 - ayvango
1
@ayvango 我明白你的意思了 - 我之前考虑的是返回值,而不是检查 - 你说得对。我会进行更新。 - Gareth Latty
根据上面的答案,你可以这样做:files = list(filter(lambda x: os.path.isfile(x), os.listdir(path))) - Ganesh Kathiresan
显示剩余3条评论

11
files = next(os.walk('..'))[2]

3
接下来是什么?有一句话引起了我的注意,但我不理解它的意思。 - KcFnMi
也许使用next(os.walk(os.getcwd()))[2]更好? - Ferroao

10
自 Python 3.6 版本开始,你可以使用 glob 的递归选项 "**"。请注意,glob 将会返回所有的文件和目录,因此需要筛选出只有文件的部分。
files = glob.glob(join(in_path, "**/*"), recursive=True)
files = [f for f in files if os.path.isfile(f)]

9

在Windows中使用pathlib的方法如下:

files = (x for x in Path("your_path").iterdir() if x.is_file())

会出现以下错误:

TypeError: 'WindowsPath' object is not iterable

你应该使用Path.iterdir()

filePath = Path("your_path")
if filePath.is_dir():
    files = list(x for x in filePath.iterdir() if x.is_file())

7

对于在当前目录中操作文件的特殊情况,您可以使用简单的一行列表推导式来完成:

[f for f in os.listdir(os.curdir) if os.path.isfile(f)]

否则在更一般的情况下,需要连接目录路径和文件名:
dirpath = '~/path_to_dir_of_interest'
files = [f for f in os.listdir(dirpath) if os.path.isfile(os.path.join(dirpath, f))]

4
您可以尝试使用pathlib,该库还有许多其他有用的内容。
Pathlib是一个面向对象的库,用于与文件系统路径交互。要获取当前目录中的文件,可以执行以下操作:
from pathlib import *
files = (x for x in Path(".") if x.is_file())
for file in files:
    print(str(file), "is a file!")

在我看来,这比使用os.path更符合Python的风格。

另请参阅:PEP 428


4
一个常见的建议是避免那种类型的导入。也就是说,最好只导入你需要使用的部分,对于你的情况来说,就是from pathlib import Path - tshepang
1
虽然pathlib很好用,但我认为它取决于脚本的实际情况 - 如果只是偶尔处理文件,完全依赖pathlib可能有些大材小用。 - Gareth Latty

2
使用pathlib,列出仅文件的最短方式是:
[x for x in Path("your_path").iterdir() if x.is_file()]

需要的话可以提供深度支持。

那么如何指定深度呢? - bugmenot123

1
如果您使用Python 3,您可以使用pathlib但是,您需要知道如果使用is_dir()方法:
from pathlib import *

#p is directory path
#files is list of files in the form of path type

files=[x for x in p.iterdir() if x.is_file()]

.iterdir() 会跳过空文件。

我找到的解决方案是:

from pathlib import *

#p is directory path

#listing all directory's content, even empty files
contents=list(p.glob("*"))

#if element in contents isn't a folder, it's a file
#is_dir() even works for empty folders...!

files=[x for x in contents if not x.is_dir()]

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