2013-01-05 47 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()] 

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