2016-01-24 86 views
2

我有一个文件夹有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 
+0

你需要使用水珠。 –

+2

你能解释你如何试图对它们进行分区吗?它是由'_ '部分和文件扩展名组成的吗? –

+0

如果fi.find(“_ a.png”)> -1]''list_one = [fi for all_file中的fi' – boardrider

回答

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

考虑使用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)]