我有一个文件目录,其中一些是图像文件。其中一些图像文件是一系列图像。它们可以命名为image-000001.png
,image-000002.png
等等,或者可能是001_sequence.png
,002_sequence.png
等。
我们怎样才能识别出一个人类出现的图像,这些图像在一个序列中显然非常明显?这意味着只识别那些数字不断增加的图像文件名,并且都具有相似的文件名形式。
文件名的相似部分不会被预先定义。
答案 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)
当然,如果有一些缺失值,这将无效,但您可以使用一些接受错误。