2013-01-05 118 views
16

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

+0

[相关](http://stackoverflow.com/q/6664205) – Tshepang

回答

29

这是a simple generator expression

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): 
    ... 
+0

为什么我得到一个downvote呢? –

+0

您忘记了在dirname和filename之间添加连接 – ayvango

+0

@ayvango这只是一种不同的行为 - 没有要求在问题中提供完整路径,并且这种行为按照定义明确的方式工作。 –

1

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

+2

一个常见的建议是避免这种导入。也就是说,只是导入你使用的东西,在你的情况下,它只是'从pathlib导入路径'。 – Tshepang

+1

虽然'pathlib'很好,但我会认为它取决于手头的脚本 - 如果它只处理文件几次,取决于'pathlib'可能是矫枉过正的。 –

2

在Windows中使用pathlib如下:

files = (x for x in Path("your_path") 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()) 
2
files = next(os.walk('..'))[2] 
0

使用pathlib,最近的路ŧ o仅列出文件是:

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

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