根据文件名过滤文件

时间:2016-01-24 13:43:04

标签: python file os.walk

我有一个包含4种不同文件的文件夹。例如:

类型1:00001_a.png

类型2:00231_b.mat

类型3:00001_c.jpg

类型4:00001_c.png

如何将这些文件过滤到4个列表中?我目前的解决方案只能根据文件扩展名进行过滤。

all_file = os.walk(input_path).next()[2] #get files only
list_one = [ fi for fi in all_file if fi.endswith("*.png") ] # "*_a.png" won't work

2 个答案:

答案 0 :(得分:1)

只需省略*中的星号(endswith())即可,它会按预期工作,例如fi.endswith('_a.png')

提出了更好的解决方案,避免对支持的类型进行硬编码:

from collections import defaultdict

def get_file_type(filename):
    base, ext = os.path.splitext(filename)
    return base.rsplit('_', 1)[1] + ext

files_by_type = defaultdict(list)
for filename in os.listdir(input_path):
    filetype = get_file_type(filename)
    files_by_type[filetype].append(filename)

答案 1 :(得分:1)

考虑使用os模块列表目录的正则表达式解决方案:

import os, re

# CURRENT DIRECTORY OF RUNNING SCRIPT (OR MANUALLY ENTER PATH)
cd = os.path.dirname(os.path.abspath(__file__))

a_pngfiles = [file for file in os.listdir(cd) if re.match("^.*_a.png$", file)]
b_matfiles = [file for file in os.listdir(cd) if re.match("^.*_b.mat$", file)]
c_jpgfiles = [file for file in os.listdir(cd) if re.match("^.*_c.jpg$", file)]
c_pngfiles = [file for file in os.listdir(cd) if re.match("^.*_c.png$", file)]
相关问题