2016-01-24 2 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

вам нужно использовать Glob. –

+2

Можете ли вы объяснить, как вы пытаетесь их разбить? Это как часть '_ ', так и расширение файла? –

+0

Вы также можете попробовать 'list_one = [fi для fi в all_file, если fi.find (" _ a.png ")> -1]' – 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)] 

 Смежные вопросы

  • Нет связанных вопросов^_^