【问题标题】:Ways to filter files in directory and join directory path - Python过滤目录中的文件并加入目录路径的方法 - Python
【发布时间】:2017-02-14 19:35:39
【问题描述】:

给定后缀和目录路径,我需要提取目录中以给定后缀结尾的文件的完整路径。

目前,我正在这样做:

import os
dir_path = '/path/to/dir'
suffix = '.xyz'
filenames = filter(lambda x: x.endswith(suffix), os.listdir(dir_path))
filenames = map(lambda x: os.path.join(dir_path, x), filenames)

我也可以使用glob

import glob
dir_path = '/path/to/dir'
suffix = '.xyz'
glob.glob(dir_path+'*.'+suffix)

我知道还有pathlib 可以使用PurePath 检查后缀,但我不确定它的语法是什么。

还有其他方法可以实现相同的文件完整路径过滤列表吗?

【问题讨论】:

    标签: python operating-system filepath glob listdir


    【解决方案1】:

    您可以使用list comprehension 一次性构建结果:

    >>> [os.path.join(os.sep, x, dir_path) for x in os.listdir(dir_path) 
    if x.endswith(suffix)]
    ['/home/msvalkon/foo.txt', 
     '/home/msvalkon/output.txt',
     '/home/msvalkon/remaining_warnings.txt',
     '/home/msvalkon/test.txt',
     '/home/msvalkon/hdr_chksum_failure.txt']
    

    如果dir_path 始终是绝对路径,您可以使用os.path.abspath(x) 代替os.path.join()

    对于大目录,使用返回迭代器的os.scandir 可能是明智的。这会更快。

    >>> [entry.path for entry in os.scandir(dir_path) if entry.name.endswith(suffix)]
     ['/home/msvalkon/foo.txt', 
      '/home/msvalkon/output.txt',
      '/home/msvalkon/remaining_warnings.txt',
      '/home/msvalkon/test.txt',
      '/home/msvalkon/hdr_chksum_failure.txt']
    

    【讨论】:

    • 简短的问题,给定目录中的 1,000,000 个文件,filter + map 会比列表理解更快,还是反过来是正确的?或者它们会一样吗?
    • 鉴于filter() 将创建一个列表,map() 将创建另一个列表,我敢打赌列表理解会更快。不过,有了这样的数字,找到使用生成器的方法可能更明智。
    • 实际上,他们不会创建列表,过滤器和地图都返回生成器。
    • @alvas 对于 python 3 是正确的,但对于 python 2 不是。在 python 3 中都返回一个迭代器,在 python2 中都构造了结果列表。使用os.scandir()查看我的更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多