Вырежьте последовательность файлов, используя glob в python - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть каталог с файлами типа img-0001.jpg, img-0005.pg, img-0006.jpg, ... , img-xxxx.jpg. Что мне нужно сделать, это получить список со всеми файлами, начиная с 0238, буквально img-0238.jpg. Следующее существующее имя файла img-0240.jpg

Сейчас я использую glob для получения всех имен файлов.

list_images = glob.glob(path_images + "*.jpg")

Заранее спасибо

Редактировать:

-> Последнее имя файла img-0315.jpg

Ответы [ 3 ]

1 голос
/ 17 февраля 2020

Glob не разрешает фильтрацию регулярных выражений. Но вы фильтруете список сразу после получения всех подходящих файлов. Вот как это выглядело бы при использовании re:

import re

list_images = [f for f in glob.glob(path_images + "*.jpg") \
    if re.search(r'[1-9]\d{3,}|0[3-9]\d{2,}|02[4-9]\d|023[8-9]\.jpg$', f)]

Регулярное выражение с проверкой, что файл заканчивается числом, которое на 4 цифры больше или равно 0238.

Вы можете играть вокруг с регулярным выражением, используя https://regex101.com/

В основном, мы проверяем, является ли число:

  • начинается с 1, за которым следуют любые 3 цифры
  • или начинается с 0[3-9], за которым следуют любые 2 цифры
  • или начинается с 02[4-9], за которым следуют любые 1 di git
  • или начинается с 023 и затем 8 или 9.

Но, вероятно, было бы проще сделать простое сравнение:

list_images = [f for f in glob.glob(path_images + "*.jpg") \
     if f[-8:-4] > "0237" and f[-8:-4] < "0316"]
0 голосов
/ 18 февраля 2020

Примерно так можно попробовать библиотеку wcmatch . Это библиотека, цель которой - улучшить глобализацию файлов и сопоставление с подстановочными знаками.

В этом примере мы включаем расширение brace и демонстрируем шаблон путем фильтрации списка файлов:

from wcmatch import glob

files = []
# Generate list of files from img-0000.jpg to img-0315.jpg
for x in range(316):
    files.append('path/img-{:04d}.jpg'.format(x))

print(glob.globfilter(files, 'path/img-{0238..0315}.jpg', flags=glob.BRACE))

И мы получаем следующий вывод:

['path/img-0238.jpg', 'path/img-0239.jpg', 'path/img-0240.jpg', 'path/img-0241.jpg', 'path/img-0242.jpg', 'path/img-0243.jpg', 'path/img-0244.jpg', 'path/img-0245.jpg', 'path/img-0246.jpg', 'path/img-0247.jpg', 'path/img-0248.jpg', 'path/img-0249.jpg', 'path/img-0250.jpg', 'path/img-0251.jpg', 'path/img-0252.jpg', 'path/img-0253.jpg', 'path/img-0254.jpg', 'path/img-0255.jpg', 'path/img-0256.jpg', 'path/img-0257.jpg', 'path/img-0258.jpg', 'path/img-0259.jpg', 'path/img-0260.jpg', 'path/img-0261.jpg', 'path/img-0262.jpg', 'path/img-0263.jpg', 'path/img-0264.jpg', 'path/img-0265.jpg', 'path/img-0266.jpg', 'path/img-0267.jpg', 'path/img-0268.jpg', 'path/img-0269.jpg', 'path/img-0270.jpg', 'path/img-0271.jpg', 'path/img-0272.jpg', 'path/img-0273.jpg', 'path/img-0274.jpg', 'path/img-0275.jpg', 'path/img-0276.jpg', 'path/img-0277.jpg', 'path/img-0278.jpg', 'path/img-0279.jpg', 'path/img-0280.jpg', 'path/img-0281.jpg', 'path/img-0282.jpg', 'path/img-0283.jpg', 'path/img-0284.jpg', 'path/img-0285.jpg', 'path/img-0286.jpg', 'path/img-0287.jpg', 'path/img-0288.jpg', 'path/img-0289.jpg', 'path/img-0290.jpg', 'path/img-0291.jpg', 'path/img-0292.jpg', 'path/img-0293.jpg', 'path/img-0294.jpg', 'path/img-0295.jpg', 'path/img-0296.jpg', 'path/img-0297.jpg', 'path/img-0298.jpg', 'path/img-0299.jpg', 'path/img-0300.jpg', 'path/img-0301.jpg', 'path/img-0302.jpg', 'path/img-0303.jpg', 'path/img-0304.jpg', 'path/img-0305.jpg', 'path/img-0306.jpg', 'path/img-0307.jpg', 'path/img-0308.jpg', 'path/img-0309.jpg', 'path/img-0310.jpg', 'path/img-0311.jpg', 'path/img-0312.jpg', 'path/img-0313.jpg', 'path/img-0314.jpg', 'path/img-0315.jpg']

Итак, мы можем применить это к поиску файла:

from wcmatch import glob

list_images = glob.glob('path/img-{0238..0315}.jpg', flags=glob.BRACE)

В этом примере мы жестко закодировали путь , но в вашем примере, убедитесь, что path_images имеет завершающий /, чтобы шаблон был построен правильно. Другие предположили, что это может быть проблемой. Распечатайте ваш шаблон, чтобы подтвердить, что шаблон правильный.

0 голосов
/ 17 февраля 2020

Вы можете указать несколько повторяющихся подстановочных знаков для соответствия всем файлам, чей номер 23[89] или 2[4-9][0-9] или 30[0-9] и т. Д .;

list_images = []
for pattern in ('023[89]', '02[4-9][0-9]', '030[0-9]', '031[0-5]'):
    list_images.extend(glob.glob(
        os.path.join(path_images, '*{0}.jpg'.format(pattern))))

или вы можете просто отфильтровать те, которые вам не нужны хочу.

list_images = [x for x in glob.glob(os.path.join(path_images, "*.jpg"))
    if 238 <= int(x[-8:-4]) <= 315]
...