У меня есть каталог с кучей файлов внутри: eee2314
, asd3442
... и eph
.
Я хочу исключить все файлы, начинающиеся с eph
с помощью функции glob
.
Как я могу это сделать?
У меня есть каталог с кучей файлов внутри: eee2314
, asd3442
... и eph
.
Я хочу исключить все файлы, начинающиеся с eph
с помощью функции glob
.
Как я могу это сделать?
Правила шаблона для glob не являются регулярными выражениями. Вместо этого они следуют стандартным правилам расширения пути Unix. Есть только несколько специальных символов: две разные wild-cards и диапазоны символов поддерживаются [из glob].
Таким образом, вы можете исключить некоторые файлы с шаблонами.
Например, чтобы исключить файлы манифеста (файлы, начинающиеся с _
) с помощью glob, вы можете использовать:
files = glob.glob('files_path/[!_]*')
Вы не можете исключать шаблоны с помощью функции glob
, глобусы допускают только шаблоны включения. Синтаксис глобализации очень ограничен (даже класс символов [!..]
должен соответствовать символу, поэтому это шаблон включения для каждого символа, которого нет в классе).
Вы должны будете сделать свою собственную фильтрацию; здесь хорошо работает понимание списка:
files = [fn for fn in glob('somepath/*.txt')
if not os.path.basename(fn).startswith('eph')]
Вы можете вычесть наборы:
set(glob("*")) - set(glob("eph*"))
Поздно к игре, но вы можете просто применить 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']
В общем случае, чтобы исключить файлы, которые не соответствуют некоторому регулярному выражению оболочки, вы можете использовать модуль 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)
Вышеприведённое будет сначала генерировать список из заданного пути, а затем выскочить из файлов, которые не будут удовлетворять регулярному выражению с требуемым ограничением.
Сравните с 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
.
Как упоминалось в принятом ответе, вы не можете исключать шаблоны с помощью 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*"))
(В моем случае у меня были некоторые рамки изображений, рамки смещения и плоские кадры в одном каталоге, и мне просто нужны кадры изображения)
Как насчет пропустить конкретный файл, перебирая все файлы в папке! Приведенный ниже код пропустит все файлы 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)
Таким образом, вы можете использовать более сложные шаблоны регулярных выражений, чтобы включать/исключать определенный набор файлов в папке.
Вы можете использовать следующий метод:
# 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.