Как идентифицировать файлы с возрастающими числами и аналогичной формой имени файла?
У меня есть каталог файлов, некоторые из них – файлы изображений. Некоторые из этих файлов изображений представляют собой последовательность изображений. Их можно назвать image-000001.png
, image-000002.png
и т. Д., Или, возможно, 001_sequence.png
, 002_sequence.png
и т. Д.
Как мы можем идентифицировать образы, которые, по мнению человека, были бы очевидными в последовательности? Это означало бы идентифицировать только те имена файлов изображений, которые имеют все возрастающие числа, и все они имеют аналогичную форму имени файла.
Аналогичная часть имени файла не будет определена заранее.
- Как импортировать пространство имен / перечисление объектов COM в Python?
- Отображение имен в Python
- подклассифицированный словарь python для пользовательского пространства имен в методе exec ()
- Просмотр списка всех операторов python через интерпретатор
- Что означает «сайт» в «сайтах-пакетах»?
Вы можете использовать регулярное выражение для получения файлов, привязанных к определенному шаблону, например .*\d+.*\.(jpg|png)
для чего угодно, затем числа, затем еще чего-нибудь и расширения изображения.
files = ["image-000001.png", "image-000002.png", "001_sequence.png", "002_sequence.png", "not an image 1.doc", "not an image 2.doc", "other stuff.txt", "singular image.jpg"] import re image_files = [f for f in files if re.match(r".*\d+.*\.(jpg|png)", f)]
Теперь сгруппируйте эти файлы изображений, заменив их на некоторую общую строку, например XXX
:
patterns = collections.defaultdict(list) for f in image_files: p = re.sub("\d+", "XXX", f) patterns[p].append(f)
В результате patterns
{'image-XXX.png': ['image-000001.png', 'image-000002.png'], 'XXX_sequence.png': ['001_sequence.png', '002_sequence.png']}
Точно так же не должно быть слишком сложно проверить, являются ли все эти числа последовательными, но, возможно, это вообще не нужно. Обратите внимание, однако, что это будет иметь проблемы с дискриминацией нумерованных серий, таких как "series1_001.jpg"
и "series2_001.jpg"
.
Я бы предложил использовать файлы regex
и шаблон сопоставления групп со списком связанных чисел из имени файла.
Как только это будет сделано, просто зациклируйте ключи dictionnaries и убедитесь, что количество элементов совпадает с количеством совпадающих чисел.
import re from collections import defaultdict from os import listdir files = listdir("/the/path/") found_patterns = defaultdict(list) p = re.compile("(.*?)(\d+)(.*)\.png") for f in files: if p.match(f): s = p.search(f) pattern = s.group(1) + "___" + s.group(3) num = int(s.group(2)) found_patterns[pattern].append(num) for pattern, found in found_patterns.items(): mini, maxi = min(found), max(found) if len(found) == maxi - mini + 1: print("Pattern correct: %s" % pattern)
Конечно, это не сработает, если есть недостающее значение, но вы можете использовать некоторую ошибку принятия.
- h5py не создан должным образом против mpi4py
- Как сделать графические изображения в модуле gnuplot для python?
- В чем преимущество использования функции лямбда: None?
- Как разрешить конфликты пространства имен в моих пакетах Python со стандартными именами пакетов библиотеки?
- Использование итератора для печати целых чисел
- Список модулей в пакете пространства имен
- Поиск общих советов о том, как предотвратить неустанное «NameErrors» в Python
- Функция генератора питонов / назначение имен объектов
- Упростить матрицу путем усреднения нескольких ячеек
- Python: как я могу импортировать пространство имен какого-либо объекта в текущее пространство имен?
- Могу ли я открыть сокеты в нескольких пространствах имен из моего кода на Python?