Подтвердить что ты не робот

Шаблон исключения glob

У меня есть каталог с кучей файлов внутри: eee2314, asd3442... и eph.

Я хочу исключить все файлы, начинающиеся с eph с помощью функции glob.

Как я могу это сделать?

4b9b3361

Ответ 1

Правила шаблона для glob не являются регулярными выражениями. Вместо этого они следуют стандартным правилам расширения пути Unix. Есть только несколько специальных символов: две разные wild-cards и диапазоны символов поддерживаются [из glob].

Таким образом, вы можете исключить некоторые файлы с шаблонами.
Например, чтобы исключить файлы манифеста (файлы, начинающиеся с _) с помощью glob, вы можете использовать:

files = glob.glob('files_path/[!_]*')

Ответ 2

Вы не можете исключать шаблоны с помощью функции glob, глобусы допускают только шаблоны включения. Синтаксис глобализации очень ограничен (даже класс символов [!..] должен соответствовать символу, поэтому это шаблон включения для каждого символа, которого нет в классе).

Вы должны будете сделать свою собственную фильтрацию; здесь хорошо работает понимание списка:

files = [fn for fn in glob('somepath/*.txt') 
         if not os.path.basename(fn).startswith('eph')]

Ответ 3

Вы можете вычесть наборы:

set(glob("*")) - set(glob("eph*"))

Ответ 4

Поздно к игре, но вы можете просто применить python filter к результату glob:

files = glob.iglob('your_path_here')
files_i_care_about = filter(lambda x: not x.startswith("eph"), files)

или заменив лямбда соответствующим поиском регулярных выражений и т.д.

EDIT: я просто понял, что если вы используете полные пути, startswith не будет работать, поэтому вам понадобится регулярное выражение

In [10]: a
Out[10]: ['/some/path/foo', 'some/path/bar', 'some/path/eph_thing']

In [11]: filter(lambda x: not re.search('/eph', x), a)
Out[11]: ['/some/path/foo', 'some/path/bar']

Ответ 5

В общем случае, чтобы исключить файлы, которые не соответствуют некоторому регулярному выражению оболочки, вы можете использовать модуль fnmatch:

import fnmatch

file_list = glob('somepath')    
for ind, ii in enumerate(file_list):
    if not fnmatch.fnmatch(ii, 'bash_regexp_with_exclude'):
        file_list.pop(ind)

Вышеприведённое будет сначала генерировать список из заданного пути, а затем выскочить из файлов, которые не будут удовлетворять регулярному выражению с требуемым ограничением.

Ответ 6

Сравните с glob, рекомендую pathlib, отфильтровать один шаблон очень просто.

from pathlib import Path
p = Path(YOUR_PATH)
filtered = [x for x in p.glob('**/*') if not x.name.startswith('eph'))]

и если вы хотите отфильтровать более сложный шаблон, вы можете определить функцию для этого, например:

def not_in_pattern(x):
    return (not x.name.startswith('eph')) and 
            not x.name.startswith('epi')'))

filtered = [x for x in p.glob('**/*') if not_in_pattern(x)]

Используя этот код, вы можете фильтровать все файлы, которые начинаются с eph или начинаются с epi.

Ответ 7

Как упоминалось в принятом ответе, вы не можете исключать шаблоны с помощью glob, поэтому ниже приведен метод фильтрации вашего результата glob.

Принятый ответ, вероятно, лучший питонический способ сделать что-то, но если вы считаете, что восприятие списков выглядит немного уродливым и хочет сделать ваш код максимально бесшумным в любом случае (как и я), тогда вы можете это сделать (но обратите внимание, что это вероятно, менее эффективен, чем метод понимания списка):

import glob

data_files = glob.glob("path_to_files/*.fits")

light_files = np.setdiff1d( data_files, glob.glob("*BIAS*"))
light_files = np.setdiff1d(light_files, glob.glob("*FLAT*"))

(В моем случае у меня были некоторые рамки изображений, рамки смещения и плоские кадры в одном каталоге, и мне просто нужны кадры изображения)

Ответ 8

Как насчет пропустить конкретный файл, перебирая все файлы в папке! Приведенный ниже код пропустит все файлы Excel, которые начинаются с 'eph'

import glob
import re
for file in glob.glob('*.xlsx'):
    if re.match('eph.*\.xlsx',file):
        continue
    else:
        #do your stuff here
        print(file)

Таким образом, вы можете использовать более сложные шаблоны регулярных выражений, чтобы включать/исключать определенный набор файлов в папке.

Ответ 9

Вы можете использовать следующий метод:

# Get all the files
allFiles = glob.glob("*")
# Files starting with eph
ephFiles = glob.glob("eph*")
# Files which doesnt start with eph
noephFiles = []
for file in allFiles:
    if file not in ephFiles:
        noephFiles.append(file)
# noepchFiles has all the file which doesnt start with eph.

Thank you.