如何识别具有不断增加的数字和类似形式的文件名的文件?

时间:2015-08-19 07:33:13

标签: python list parsing sequence filenames

我有一个文件目录,其中一些是图像文件。其中一些图像文件是一系列图像。它们可以命名为image-000001.pngimage-000002.png等等,或者可能是001_sequence.png002_sequence.png等。

我们怎样才能识别出一个人类出现的图像,这些图像在一个序列中显然非常明显?这意味着只识别那些数字不断增加的图像文件名,并且都具有相似的文件名形式。

文件名的相似部分不会被预先定义。

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式来获取符合特定模式的文件,例如.*\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"

答案 1 :(得分:1)

我建议使用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)

当然,如果有一些缺失值,这将无效,但您可以使用一些接受错误。