如何识别编号递增且文件名形式相似的文件?

How to identify files that have increasing numbers and a similar form of filename?

我有一个文件目录,其中一些是图像文件。其中一些图像文件是一系列图像。它们可以命名为 image-000001.pngimage-000002.png 等等,或者可能是 001_sequence.png002_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 槽文件和组匹配模式以及文件名中的相关数字列表。

完成后,只需遍历字典键并确保元素计数与匹配数字范围相同。

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)

当然,如果有一些缺失值,这将不起作用,但你可以使用一些接受错误。