Python 重复命名

Python Duplicate naming

目标是为重复字符串创建一个命名系统。

如果名称是 hotdog.jpg,我想复制一个,下一个字符串是 hotdog_1.jpg。等等。但我面临的问题是,如果您复制 hotdog_1.jpg,我们会得到 hotdog_1_1.jpg。我试图检查字符串是否以“(下划线)+数字”结尾。但问题是字符串也可能有“(下划线)+数字+数字”。像 hotdog_13.jpg.

有什么好的实现方法吗?

for current_image_name in self.images_names:
    extension = os.path.splitext(current_image_name)[1]
    current_image_name = os.path.splitext(current_image_name)[0]

    if current_image_name[-2] == '_' and current_image_name[-1].isdigit():
        self.images_names.insert(self.current_index + 1, current_image_name[:-1] + str(int(self.images_names[self.current_index][-1]) + 1) + extension)
        name_change = True

if not name_change:
    self.images_names.insert(self.current_index + 1, self.images_names[self.current_index] + '_1')

您可以使用一种简单的方法来完成此操作,该方法可以执行一些字符串魔术。

EDITED 阅读对问题的评论后。添加了处理列表的方法

代码

def inc_filename(filename: str) -> str:
    if "." in filename:
        # set extension
        extension = f""".{filename.split(".")[-1]}"""
        # remove extension from filename
        filename = ".".join(filename.split(".")[:-1])
    else:
        # set extension to empty if not included
        extension = ""
    try:
        # try to set the number
        # it will throw a ValueError if it doesn't have _1
        number = int(filename.split("_")[-1]) +1
        newfilename = "_".join(filename.split("_")[:-1])
    except ValueError:
        # catch the ValueError and set the number to 1
        number = 1
        newfilename = "_".join(filename.split("_"))
    return f"{newfilename}_{number}{extension}"


def inc_filelist(filelist: list) -> list:
    result = []
    for filename in filelist:
        filename = inc_filename(filename)
        while filename in filelist or filename in result:
            filename = inc_filename(filename)
        result.append(filename)
    return result


print(inc_filename("hotdog_1"))
print(inc_filename("hotdog"))
print(inc_filename("hotdog_1.jpg"))
print(inc_filename("hotdog.jpg"))
print(inc_filename("ho_t_dog_15.jpg"))
print(inc_filename("hotdog_1_91.jpg"))

filelist = [
    "hotdog_1.jpg",
    "hotdog_2.jpg",
    "hotdog_3.jpg",
    "hotdog_4.jpg"
]

print(inc_filelist(filelist))

输出

hotdog_2
hotdog_1
hotdog_2.jpg
hotdog_1.jpg
ho_t_dog_16.jpg
hotdog_1_92.jpg
['hotdog_5.jpg', 'hotdog_6.jpg', 'hotdog_7.jpg', 'hotdog_8.jpg']