51

有没有办法用 Python 列出目录中的文件(不是目录)?我知道我可以使用sos.listdir的循环os.path.isfile(),但如果有更简单的东西(比如函数os.path.listfilesindir或其他东西),它可能会更好。

4

8 回答 8

62

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

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):
    ...
于 2013-01-05T20:38:16.640 回答
9
files = next(os.walk('..'))[2]
于 2017-09-06T09:24:55.523 回答
7

在 Windows 中使用 pathlib 如下:

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

产生错误:

TypeError:“WindowsPath”对象不可迭代

你应该使用Path.iterdir()

filePath = Path("your_path")
if filePath.is_dir():
    files = list(x for x in filePath.iterdir() if x.is_file())
于 2016-01-25T11:36:50.887 回答
5

从 Python 3.6 开始,您可以使用带有递归选项“**”的 glob。请注意,glob 将为您提供所有文件和目录,因此您只能保留文件

files = glob.glob(join(in_path, "**/*"), recursive=True)
files = [f for f in files if os.path.isfile(f)]
于 2019-09-11T11:18:19.280 回答
3

你可以试试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.

另见:PEP 428

于 2013-01-05T20:39:46.290 回答
2

使用pathlib,仅列出文件的最短方法是:

[x for x in Path("your_path").iterdir() if x.is_file()]

如果需要,提供深度支持。

于 2017-11-17T16:20:17.197 回答
2

对于使用当前目录中的文件的特殊情况,您可以将其作为简单的单行列表理解:

[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))]
于 2018-07-20T09:17:41.700 回答
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()]
于 2020-01-17T23:58:02.680 回答