Как идентифицировать файлы с возрастающими числами и аналогичной формой имени файла?

У меня есть каталог файлов, некоторые из них – файлы изображений. Некоторые из этих файлов изображений представляют собой последовательность изображений. Их можно назвать image-000001.png , image-000002.png и т. Д., Или, возможно, 001_sequence.png , 002_sequence.png и т. Д.

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

Аналогичная часть имени файла не будет определена заранее.

Вы можете использовать регулярное выражение для получения файлов, привязанных к определенному шаблону, например .*\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) 

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