如何识别编号递增且文件名形式相似的文件?
How to identify files that have increasing numbers and a similar form of filename?
我有一个文件目录,其中一些是图像文件。其中一些图像文件是一系列图像。它们可以命名为 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
槽文件和组匹配模式以及文件名中的相关数字列表。
完成后,只需遍历字典键并确保元素计数与匹配数字范围相同。
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)
当然,如果有一些缺失值,这将不起作用,但你可以使用一些接受错误。
我有一个文件目录,其中一些是图像文件。其中一些图像文件是一系列图像。它们可以命名为 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
槽文件和组匹配模式以及文件名中的相关数字列表。
完成后,只需遍历字典键并确保元素计数与匹配数字范围相同。
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)
当然,如果有一些缺失值,这将不起作用,但你可以使用一些接受错误。