仅列出目录中的文件?

时间:2013-01-05 20:36:45

标签: python

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

9 个答案:

答案 0 :(得分:38)

这是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):
    ...

答案 1 :(得分:5)

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

答案 2 :(得分:4)

在Windows中使用pathlib如下:

  

files =(x表示路径中的x(“your_path”),如果是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())

答案 3 :(得分: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更多Pythonic。

另请参阅:PEP 428

答案 4 :(得分: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()]

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

这将仅提供文件列表

import glob
#mydir is the location to search
files_only = glob.glob(mydir+'\\*.*')

答案 7 :(得分:0)

对于处理当前目录中文件的特殊情况,您可以将其作为简单的一列式列表理解来实现:

[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))]

答案 8 :(得分:0)

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

files = glob.glob(join(in_path, "**/*"), recursive=True)
files = [f for f in files if isfile(f)]