python-批量修改图片名称(按序号排序)

1.效果

一个文件夹中任意多张图片,图片名称无限制,转换为按序号排序:1.jpg 2.jpg 3.jpg...

未变换前:

变换后:

 

2.代码

import os
import re

def ReName(dir_Path,pattern):

    i = 1
    for filename in os.listdir(dir_Path):
        print(filename)
        new_filename = str(i) + ".jpg"
        print(new_filename)
        os.rename(os.path.join(dir_Path, filename), os.path.join(dir_Path, new_filename))
        i = i + 1

    print("----------Success!-------------")

if __name__ == '__main__':

    dir_Path = r"E:\input"
    pattern = re.compile(r'.*')
    ReName(dir_Path,pattern)


<think>好的,我现在需要帮用户写一个Python脚本,用来批量重命名一个文件夹里的所有图片,按照序排列。首先,我得确认用户的具体需求是什么。用户想要将文件夹中的所有图片文件改名,按数字序排列。可能的文件名格式比如0001.jpg、0002.png等等。接下来,我需要考虑如何实现这个功能。 首先,得确定用户使用的Python环境,是否需要处理不同的图片格式,比如jpg、png、gif等。可能需要让脚本自动识别这些扩展名。然后,如何遍历文件夹中的文件,过滤出图片文件。可能需要使用os模块的listdir函数,然后检查每个文件的扩展名是否在指定的列表中。 接下来是排序问题。用户可能希望按某种顺序来重命名,比如按文件名升序,或者按修改时间排序。这里用户没有特别说明,但通常可能希望按照当前文件名顺序或者文件创建时间排序。可能需要询问用户,但根据常规需求,可能默认按文件排序,或者按修改时间排序。不过,为了稳妥,可能在代码中按文件名的字母顺序处理,或者让用户选择排序方式。不过用户可能希望保持简单,所以暂时先按文件名的顺序处理,或者不排序,直接按遍历顺序处理?需要注意,不同操作系统的文件遍历顺序可能不同,这可能导致结果不一致。所以或许应该先按文件排序,或者按修改时间排序,但用户可能更希望按原来的顺序,但原顺序可能不明确。可能需要让用户指定,但用户可能希望自动处理,所以可能需要默认按文件排序。 然后是重命名的过程。需要遍历每个图片文件,然后生成新的文件名,如“0001.jpg”、“0002.png”等,保持原有的扩展名。序可能需要前导零,比如总共有100个文件的话,序是三位还是四位?比如,如果文件数量不确定,可能需要根据文件数量确定位数,例如总数量为123,则用三位数,如001、002...123。或者统一用四位,比如0001,这样即使数量超过1000也没问题。用户可能希望用固定位数,比如四位,这样文件名整齐。因此,可能需要在格式化时使用04d这样的格式,比如“{:04d}”.format(index)。 接下来需要考虑的是目标文件夹是否为当前目录,或者需要指定路径。用户可能需要输入文件夹路径,或者直接在脚本中配置。所以可能需要用input函数让用户输入文件夹路径,或者通过命令行参数传入。这里可能让用户输入路径比较方便,或者在代码中设置变量。例如,在代码中设置folder_path变量,用户需要将其改为自己的路径。 另外,处理文件时,需要确保不会覆盖已存在的文件。比如,假设原来的文件夹中已经有类似0001.jpg文件,直接重命名可能会导致冲突。因此,可能需要先将所有文件移动到一个临时目录,或者分两步处理。但更简单的方法是先收集所有文件,生成新文件名,然后逐个重命名。但如果在同一个文件夹中,直接重命名可能会导致问题。例如,原文件名为“image1.jpg”,新文件名为“0001.jpg”,如果直接重命名的话,当处理到后面的文件时,可能会覆盖前面的。例如,假设有文件“0001.jpg”已经存在,这时候处理另一个文件并重命名为“0001.jpg”就会覆盖。因此,必须确保在重命名过程中不会覆盖现有文件。因此,可能需要分两步处理:先复制或移动所有文件到新目录,或者在当前目录中分阶段处理,例如先全部重命名为临时文件名,然后再重命名为目标文件名。或者,可以先收集所有文件,生成新文件名列表,然后按顺序处理,确保没有冲突。 或者,可以先将所有文件重命名为临时名称,比如在文件名前加一个前缀,然后再重命名为目标名称。例如,先将所有文件改名为“temp_1.jpg”,“temp_2.png”,然后再将这些临时文件改名为“0001.jpg”,“0002.png”。这样可以避免覆盖问题。但这样处理的话,需要两次遍历。或者,可以先将所有文件复制到另一个目录,然后处理。但用户可能希望直接在原文件夹中处理,不需要复制。因此,必须找到一个安全的方法。 或者,可以按逆序处理文件。例如,如果文件文件排序后的顺序是a.jpg, b.jpg, c.jpg,当将它们重命名为0001.jpg, 0002.jpg等时,如果按原顺序处理,假设原文件名中有类似1.jpg的情况,可能覆盖。所以,处理顺序可能需要从最后一个文件开始,这样避免覆盖。例如,假设原文件中有“1.jpg”,当处理到它的时候,如果新名字是0001.jpg,而当前文件夹中已经有0001.jpg(比如原文件中的另一个文件),这会导致问题。因此,必须确保在重命名过程中,新文件名不会和原文件夹中的任何文件冲突,包括未被处理的文件。 这种情况下,可能需要先收集所有需要处理的文件列表,然后生成新文件名列表,确保新文件名在原始文件列表中不存在。或者,可能更简单的方式是先将所有文件移动到临时目录,处理后再移回来,但这可能比较复杂。或者,可以先将所有文件重命名为一个唯一的临时名称,例如使用UUID,然后再按顺序重命名。但这可能比较麻烦。 另一个办法是使用os.rename的原子操作,但如果新旧文件名在同一个文件系统下,可以正确执行。但如果在同一文件夹中,直接重命名可能会有冲突。例如,假设有一个文件名为“2.jpg”,而新文件名是“0001.jpg”,如果原文件夹中没有“0001.jpg”,则没问题。但如果存在其他文件会被重命名为已存在的名称,就会出问题。因此,必须确保新生成的文件名在原始文件夹中不存在,或者处理顺序不会导致冲突。 可能用户的目标是,将所有图片文件按序重新命名,不管原来的文件名是什么,并且确保新文件名是连续的,如0001、0002等。因此,正确的处理步骤应该是: 1. 指定目标文件夹。 2. 获取所有图片文件(根据扩展名过滤)。 3. 确定排序方式(按名称修改时间等)。 4. 生成新文件名列表,按序,如0001、0002等。 5. 逐个重命名文件,确保不会覆盖。 问题在于如何安全地执行重命名,避免覆盖。例如,如果原来的文件夹中已经存在0001.jpg,而处理后的文件也需要命名为0001.jpg,那么这将导致冲突。因此,可能需要先检查目标文件名是否存在,如果存在,可能需要跳过或处理冲突。但用户的需求可能是覆盖原文件吗?可能不是,用户可能希望将原来的文件名全部改为新的序,不管原来的文件名是什么。因此,如果原来的文件名中有类似0001.jpg,而该文件本身是需要被处理的,那么可能没有问题。例如,假设原来的文件包括“0001.jpg”,在遍历时,这个文件会被处理,并被重命名为新的序,比如如果它是第一个文件,则保持0001.jpg,否则可能被重命名为其他名称。这可能需要更仔细的处理。 例如,假设文件夹中有两个文件:0001.jpg和image.jpg。当处理时,假设排序后的顺序是image.jpg在前,0001.jpg在后。那么第一个文件会被重命名为0001.jpg,这时候原来的0001.jpg文件会被覆盖吗?是的,因为当处理第二个文件(原0001.jpg)时,它的新名称可能是0002.jpg。但如果在处理第一个文件时,将image.jpg重命名为0001.jpg,这会覆盖原来的0001.jpg吗?如果原来的0001.jpg已经被读取到文件列表中,那么是的,这会导致数据丢失。这显然是一个大问题。 因此,必须确保在处理过程中,不会覆盖任何尚未处理的文件。因此,正确的处理方式是,先将所有文件重命名为临时名称,然后再将这些临时名称重命名为目标名称。例如: 步骤一:遍历所有图片文件,将它们重命名为临时名称,比如“temp_{index}.扩展名”,并记录扩展名和顺序。 步骤二:再次遍历这些临时文件,将它们重命名为目标名称,如“0001.扩展名”等。 或者,另一种方法是生成新文件名,并确保这些新文件名在原始文件夹中不存在。例如,如果目标文件名已经存在,则可能自动跳过或添加后缀。但用户的需求是严格按照序命名,不管原来的文件名是否存在。因此,可能需要先处理文件名中的潜在冲突。例如,将所有文件先移动到临时目录,处理后再移动回来。或者,在重命名时,将文件先移动到临时文件名,再移动到目标文件名。 例如,假设有一个文件列表,处理步骤如下: 1. 获取所有图片文件,并排序。 2. 为每个文件生成新文件名,例如new_name = "{:04d}{}".format(index, ext) 3. 检查新文件名是否存在于原文件列表中。如果存在,并且该文件不是当前正在处理的文件,那么可能需要调整处理顺序,或者报错。 这似乎比较复杂。 或许更好的办法是先将所有文件复制到临时文件夹,处理后再删除原文件,或者直接处理原文件,但确保新文件名不会与原文件中的其他文件冲突。例如,在生成新文件名时,确保新文件名不在原文件列表中,或者如果存在,则视为需要被处理的文件,之后会被覆盖。但这样可能导致数据丢失,比如原文件夹中存在0001.jpg,而该文件可能不是图片文件,或者在处理时被错误地覆盖。 所以,可能必须确保新生成的文件名在原始文件列表中不存在,或者在处理时,原文件已经被重命名。 或许最安全的方式是将所有文件先重命名为一个中间临时名称,比如在文件名前添加一个随机字符串,然后再将它们重命名为目标名称。例如: 第一次遍历:将每个文件重命名为"temp_" + original_name,这样确保所有原文件名被改变,避免后续重命名时的冲突。 第二次遍历:将这些临时文件按顺序重命名为目标名称。 例如: 原文件:a.jpg, 0001.jpg, image.png 第一次遍历后:temp_a.jpg, temp_0001.jpg, temp_image.png 此时原文件夹中不再有与原文件名相同的文件,因此在第二次遍历时,可以将这些临时文件重命名为0001.jpg, 0002.jpg, 0003.png,而不会出现冲突。 这种方法可以避免覆盖问题,因为所有原文件都被重命名为临时名称,之后处理时新文件名不会与任何现有文件冲突。 因此,具体的实现步骤可能是: 1. 获取目标文件夹中的所有文件。 2. 过滤出图片文件(扩展名为.jpg, .jpeg, .png, .gif等)。 3. 对图片文件进行排序(按名称、时间等,这里可能需要用户选择,但用户可能希望按当前顺序,比如按文件排序)。 4. 第一次遍历:将所有图片文件重命名为临时名称,如“temp_”+原文件名。 5. 第二次遍历:将临时文件按序重命名为目标名称,如0001.jpg等。 6. 处理完成后,返回成功信息。 这样处理可以确保在重命名过程中不会覆盖任何文件。但需要注意,原文件名中可能已经包含“temp_”前缀的情况,但可能性较低,或者用户可以确保文件夹中没有这样的文件。或者,可以使用更独特的临时前缀,比如uuid或者时间戳,但可能使代码复杂化。 另一种方式是不使用中间临时文件名,而是按逆序处理文件,例如,如果按文件名的降序处理,那么在重命名时,较大的序先处理,这样避免覆盖。例如,如果原文件中有名为0001.jpg文件,而处理顺序是从最后一个文件开始,将其重命名为更高的序,这样不会覆盖原有的低序文件。但这种方法需要确保处理顺序正确,并且文件数量不会导致序超出。 但这种方法可能比较复杂,尤其是当文件名本身不包含序时。因此,中间临时文件的方法可能更可靠。 综上,代码的大致步骤应该是: - 输入文件夹路径。 - 定义支持的图片扩展名列表。 - 获取所有文件,过滤出图片文件-图片文件进行排序(按文件名或修改时间,这里可能需要明确,但用户可能希望按文件名的字母顺序)。 - 生成临时文件名,避免冲突。 - 重命名所有图片文件为临时文件名。 - 再次遍历临时文件按序生成目标文件名并重命名。 - 处理异常,例如权限问题等。 现在,开始编写代码。首先,导入必要的模块:os,可能需要用到os.rename,os.listdir,os.path中的方法如splitext,isdir,join等。 代码的大纲: 1. 导入模块。 2. 定义图片扩展名的列表。 3. 获取用户输入的文件夹路径。 4. 检查文件夹是否存在。 5. 获取文件夹中的所有文件,过滤出图片文件。 6. 对图片文件进行排序(按文件名升序)。 7. 第一次重命名为临时文件。 8. 第二次重命名为目标序。 9. 处理异常,输出结果。 其中,第一次重命名为临时文件时,如何生成临时名称?例如,可以在原文件名前加一个前缀,如“temp_”,但如果原文件名已经有这个前缀,可能会有问题。所以,更好的方式是使用一个唯一的临时前缀,比如“temp_”+随机字符串,或者使用一个特定的前缀,并检查是否存在。或者,可以先将所有文件重命名为临时文件名,比如“temp_{index}”加上原扩展名,这样每个临时文件名都是唯一的。 或者,在第一次遍历时,将每个文件重命名为临时名称,如“temp_{原文件名}”,这样如果原文件名很长,可能会有问题,但可能性较低。或者,可以生成唯一的临时名称,例如使用uuid模块生成唯一ID,但这样可能不太直观。 但为了简单,可能直接使用“temp_”+原文件名作为临时名称。但需要确保在第一次重命名时,原文件名中没有与临时名称冲突的。例如,假设原文件中有“temp_a.jpg”,则会被重命名为“temp_temp_a.jpg”,这可能有问题。因此,可能需要分两次处理,或者确保在第一次遍历时,所有文件都被重命名,即使它们已经有“temp_”前缀。这可能比较复杂,所以或许更好的办法是先收集所有文件,生成临时名称列表,并确保这些临时名称不存在于原文件列表中。但这样可能需要多次检查。 或者,在第一次遍历时,生成临时文件名,例如“temp_{index}”加上扩展名,其中index是当前的循环索引。例如,对于第一个文件,临时文件名是temp_0.jpg,第二个是temp_1.png等等。这样,临时文件名不会与原文件冲突,因为它们都是新的名称。 这可能更可靠。例如: 步骤: 1. 获取所有图片文件列表,并排序。 2. 遍历该列表,将每个文件重命名为temp_{index}.ext,其中index是该文件在列表中的位置,从0开始。 3. 然后,再次遍历,将每个temp_{index}.ext重命名为{new_index}.ext,其中new_index是四位数的序,从1开始。 这样,第一次重命名后的文件名是temp_0.jpg,temp_1.png等,这些名称在原文件夹中不存在(假设用户没有这样的文件),因此不会冲突。然后第二次重命名时,将这些temp文件改为0001.jpg、0002.png等,因为此时原文件已经被重命名为temp文件,因此目标文件名在第一次重命名后不存在,所以不会冲突。 这种方法的优点是,无需处理原文件名中的冲突,因为第一次重命名后的文件名是唯一的。例如: 原文件列表:a.jpg, 0001.jpg, image.png 第一次遍历后:temp_0.jpg, temp_1.jpg, temp_2.png 此时原文件名已经不存在,因此第二次遍历时,将temp_0.jpg改为0001.jpg,temp_1.jpg改为0002.jpg,temp_2.png改为0003.png,不会有冲突。 这样处理可以确保安全。因此,代码的大致流程是: - 获取所有图片文件排序- 第一次循环:将每个文件重命名为temp_{i}.ext,i从0开始。 - 第二次循环:将每个temp_{i}.ext重命名为{new_index:04d}.ext,new_index从1开始。 这种方法的关键是第一次重命名后的文件名是唯一的,因此第二次重命名时不会有冲突。 现在,编写代码: 首先,导入os模块,并定义支持的扩展名: import os # 支持的图片扩展名 image_exts = ('.jpg', '.jpeg', '.png', '.gif', '.bmp') 然后,获取文件夹路径: folder_path = input('请输入文件夹路径:').strip() 检查路径是否存在: if not os.path.isdir(folder_path): print("文件夹不存在!") exit() 获取所有文件,过滤出图片文件: files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))] image_files = [f for f in files if os.path.splitext(f)[1].lower() in image_exts] 排序,比如按文件名升序: image_files.sort() 第一次重命名为temp_{i}.ext: temp_files = [] for i, filename in enumerate(image_files): ext = os.path.splitext(filename)[1].lower() temp_name = f'temp_{i}{ext}' src = os.path.join(folder_path, filename) dst = os.path.join(folder_path, temp_name) try: os.rename(src, dst) temp_files.append((temp_name, ext)) except Exception as e: print(f'重命名 {filename} 为临时文件失败:{e}') # 如果中途出错,可能需要回滚之前的操作,但这里简单处理,提示用户手动处理 exit() 第二次重命名为目标序: for idx, (temp_name, ext) in enumerate(temp_files, start=1): new_name = f'{idx:04d}{ext}' src = os.path.join(folder_path, temp_name) dst = os.path.join(folder_path, new_name) try: os.rename(src, dst) print(f'成功重命名为:{new_name}') except Exception as e: print(f'重命名 {temp_name} 为 {new_name} 失败:{e}') 这样,整个流程就完成了。但需要注意,如果在第一次重命名后,程序崩溃,会导致文件留在temp状态,需要手动处理。因此,可能需要异常处理,或者在代码中加入回滚机制,但这样会增加复杂度。对于用户来说,可能希望代码尽可能简单,所以暂时不处理这种情况,但需要在注释中说明。 此外,可能还需要处理文件名中的大小写问题,比如扩展名可能有大写,比如.JPG,因此在过滤时应该统一转换为小写。 另外,排序方式可能需要用户选择,比如按文件名、修改时间等。但用户可能希望保持简单,所以代码中按文件排序。如果需要其他排序方式,可以修改排序的key,例如按修改时间: image_files.sort(key=lambda x: os.path.getmtime(os.path.join(folder_path, x))) 但用户可能没有说明,所以默认按文件排序。 现在,将上述代码整合起来: import os def batch_rename_images(): # 支持的图片扩展名 image_exts = ('.jpg', '.jpeg', '.png', '.gif', '.bmp') # 输入文件夹路径 folder_path = input('请输入图片文件夹路径:').strip() # 检查路径是否存在 if not os.path.isdir(folder_path): print("错误:文件夹不存在!") return # 获取所有图片文件 files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))] image_files = [f for f in files if os.path.splitext(f)[1].lower() in image_exts] # 按文件排序 image_files.sort() # 第一次重命名为临时文件 temp_files = [] for i, filename in enumerate(image_files): src = os.path.join(folder_path, filename) ext = os.path.splitext(filename)[1].lower() temp_name = f'temp_{i}{ext}' dst = os.path.join(folder_path, temp_name) try: os.rename(src, dst) temp_files.append((dst, ext)) # 这里记录dst可能有问题,应记录temp_name和ext except Exception as e: print(f'错误:重命名 {filename} 为临时文件失败,原因:{e}') print('请手动检查文件状态!') return # 第二次重命名为序 for idx, (temp_full_path, ext) in enumerate(temp_files, start=1): # 这里发现之前的代码可能有问题,因为temp_files中保存的是dst路径,但实际上应该保存temp_name和ext # 修正:temp_files应该保存(temp_name, ext) # 因此,修改之前的代码: # temp_files.append((temp_name, ext)) # 然后在第二次循环中: temp_name, ext = temp_full_path # 这里可能不对,因为之前的代码append的是 (temp_name, ext) # 所以应该重新构造src路径: src = os.path.join(folder_path, temp_name) new_name = f'{idx:04d}{ext}' dst = os.path.join(folder_path, new_name) try: os.rename(src, dst) print(f'成功:{temp_name} -> {new_name}') except Exception as e: print(f'错误:重命名 {temp_name} 为 {new_name} 失败,原因:{e}') print('请手动处理剩余文件!') return print('所有文件重命名完成!') if __name__ == '__main__': batch_rename_images() 不过,上述代码在第一次循环中将temp_files.append((dst, ext)),而dst是完整的路径,如folder_path/temp_0.jpg,这会导致在第二次循环中,处理temp_full_path时,得到的是完整路径,这可能不正确。因此,应该修改为保存temp_name(即文件名部分)和扩展名: 在第一次循环中: ... temp_name = f'temp_{i}{ext}' dst = os.path.join(folder_path, temp_name) try: os.rename(src, dst) temp_files.append((temp_name, ext)) # 保存文件名和扩展名 ... 在第二次循环中: for idx, (temp_name, ext) in enumerate(temp_files, start=1): src = os.path.join(folder_path, temp_name) new_name = f'{idx:04d}{ext}' dst = os.path.join(folder_path, new_name) ... 这样修改后,代码应该正确。 因此,修正后的代码: import os def batch_rename_images(): # 支持的图片扩展名 image_exts = ('.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp') # 输入文件夹路径 folder_path = input('请输入图片文件夹路径:').strip() # 检查路径是否存在 if not os.path.isdir(folder_path): print("错误:文件夹不存在!") return # 获取所有图片文件 files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))] image_files = [f for f in files if os.path.splitext(f)[1].lower() in image_exts] # 按文件排序 image_files.sort() # 第一次重命名为临时文件 temp_files = [] for i, filename in enumerate(image_files): src = os.path.join(folder_path, filename) ext = os.path.splitext(filename)[1].lower() temp_name = f'temp_{i}{ext}' dst = os.path.join(folder_path, temp_name) try: os.rename(src, dst) temp_files.append((temp_name, ext)) except Exception as e: print(f'错误:重命名 {filename} 为临时文件失败,原因:{e}') print('请手动检查文件状态!') return # 第二次重命名为序 for idx, (temp_name, ext) in enumerate(temp_files, start=1): src = os.path.join(folder_path, temp_name) new_name = f'{idx:04d}{ext}' dst = os.path.join(folder_path, new_name) try: os.rename(src, dst) print(f'成功:{temp_name} -> {new_name}') except Exception as e: print(f'错误:重命名 {temp_name} 为 {new_name} 失败,原因:{e}') print('请手动处理剩余文件!') return print('所有文件重命名完成!') if __name__ == '__main__': batch_rename_images() 现在,这段代码应该可以正确运行。用户输入文件夹路径后,代码会处理其中的图片文件,先重命名为临时文件,再按四位序重命名。例如,原文件为a.jpg, b.png,处理后变为0001.jpg, 0002.png。 需要注意的是,如果原文件夹中有其他名为temp_0.jpg等的文件,可能在第一次重命名时被覆盖,但根据代码逻辑,第一次处理前已经过滤出图片文件,并重命名所有图片文件为temp_i.ext,因此如果原文件夹中存在这样的临时文件,它们不会被处理,因为它们是图片文件吗?例如,如果原文件夹中有temp_0.jpg,那么它会被包含在image_files列表中,并被重命名为temp_i.ext,可能导致冲突。比如,假设原文件夹中有temp_0.jpg,而i=0时,会尝试重命名为temp_0.jpg,导致错误,因为原文件已经存在。 这显然是一个问题。因此,代码中的第一次重命名步骤可能存在潜在问题,因为如果原文件夹中已经存在temp_0.jpg这样的文件,会导致os.rename失败。 因此,必须确保在第一次重命名时,生成的临时文件名在目标文件夹中不存在。如何解决这个问题? 可能的解决方案是,在生成临时文件名时,检查该名称是否已经存在,如果存在,则生成一个不同的名称。例如,使用一个循环,生成temp_{i}_{random}等,但这样会增加复杂度。 或者,可以在生成临时文件名时,使用一个唯一的标识符,例如uuid: import uuid temp_name = f'temp_{uuid.uuid4().hex}{ext}' 这样,临时文件名将唯一,避免冲突。但这样会生成较长的文件名,但可能不影响结果,因为后续会重命名为序。因此,这可能是一个更可靠的方法。 因此,修改第一次重命名的部分: for i, filename in enumerate(image_files): src = os.path.join(folder_path, filename) ext = os.path.splitext(filename)[1].lower() # 生成唯一临时文件名 unique_id = uuid.uuid4().hex temp_name = f'temp_{unique_id}{ext}' dst = os.path.join(folder_path, temp_name) try: os.rename(src, dst) temp_files.append((temp_name, ext)) except Exception as e: print(f'错误:重命名 {filename} 为临时文件失败,原因:{e}') print('请手动检查文件状态!') return 这样,临时文件名将唯一,避免冲突。但需要导入uuid模块,并在代码中添加import uuid。 这样修改后,第一次重命名的步骤将更安全。但用户可能需要安装uuid,不过uuid是Python的标准库,无需安装。 综上,最终代码如下: import os import uuid def batch_rename_images(): # 支持的图片扩展名 image_exts = ('.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp') # 输入文件夹路径 folder_path = input('请输入图片文件夹路径:').strip() # 检查路径是否存在 if not os.path.isdir(folder_path): print("错误:文件夹不存在!") return # 获取所有图片文件 files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))] image_files = [f for f in files if os.path.splitext(f)[1].lower() in image_exts] # 按文件排序 image_files.sort() # 第一次重命名为临时文件(使用UUID防止冲突) temp_files = [] for filename in image_files: src = os.path.join(folder_path, filename) ext = os.path.splitext(filename)[1].lower() # 生成唯一临时文件名 unique_id = uuid.uuid4().hex temp_name = f'temp_{unique_id}{ext}' dst = os.path.join(folder_path, temp_name) try: os.rename(src, dst) temp_files.append((temp_name, ext)) except Exception as e: print(f'错误:重命名 {filename} 为临时文件失败,原因:{e}') print('请手动检查文件状态!') return # 第二次重命名为序 for idx, (temp_name, ext) in enumerate(temp_files, start=1): src = os.path.join(folder_path, temp_name) new_name = f'{idx:04d}{ext}' dst = os.path.join(folder_path, new_name) try: os.rename(src, dst) print(f'成功:{temp_name} -> {new_name}') except Exception as e: print(f'错误:重命名 {temp_name} 为 {new_name} 失败,原因:{e}') print('请手动处理剩余文件!') return print('所有文件重命名完成!') if __name__ == '__main__': batch_rename_images() 这样,第一次重命名使用UUID生成的唯一名称,确保不会与原文件夹中的任何文件冲突。然后,第二次重命名为四位序。这样处理更安全,避免了文件名冲突的问题。 最后,测试代码。例如,在目标文件夹中放置几个图片文件,运行脚本,输入路径,观察是否重命名成功。如果一切顺利,所有图片文件将被重命名为0001.jpg、0002.png等。 可能的改进点: 1. 允许用户选择排序方式(按名称修改时间、创建时间等)。 2. 允许用户自定义序格式,例如位数、起始数字等。 3. 处理文件名中的异常字符。 4. 增加递归处理子文件夹的选项。 5. 提供更详细的错误处理和回滚机制。 但根据用户的需求,当前代码已经满足基本要求。</think>以下是实现图片批量重命名的Python代码,支持按四位序命名(例如:0001.jpg, 0002.png),并避免文件名冲突: ```python import os import uuid def batch_rename_images(): """ 批量重命名文件夹内的图片文件为四位序格式 """ # 支持的图片扩展名列表 image_exts = ('.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp') # 用户输入文件夹路径 folder_path = input('请输入图片文件夹路径:').strip() # 校验文件夹是否存在 if not os.path.isdir(folder_path): print("错误:文件夹不存在!") return # 获取所有图片文件 files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))] image_files = [f for f in files if os.path.splitext(f)[1].lower() in image_exts] # 按文件排序(可根据需求改为按时间排序) image_files.sort() # 第一阶段:重命名为临时文件名(避免覆盖) temp_files = [] for filename in image_files: src_path = os.path.join(folder_path, filename) file_ext = os.path.splitext(filename)[1].lower() # 生成唯一临时文件名(使用UUID防冲突) temp_name = f'temp_{uuid.uuid4().hex}{file_ext}' dst_path = os.path.join(folder_path, temp_name) try: os.rename(src_path, dst_path) temp_files.append((temp_name, file_ext)) except Exception as e: print(f'错误:重命名 {filename} 失败,原因:{str(e)}') print('请手动检查文件状态!') return # 第二阶段:正式重命名为序格式 for index, (temp_name, file_ext) in enumerate(temp_files, start=1): src_path = os.path.join(folder_path, temp_name) new_name = f'{index:04d}{file_ext}' # 四位数字编 dst_path = os.path.join(folder_path, new_name) try: os.rename(src_path, dst_path) print(f'成功:{temp_name} -> {new_name}') except Exception as e: print(f'错误:重命名 {temp_name} 失败,原因:{str(e)}') print('请手动处理剩余文件!') return print('所有文件重命名完成!') if __name__ == '__main__': batch_rename_images() ``` ### 使用说明 1. **输入文件夹路径** 运行代码后,输入包含图片文件夹绝对路径(例如:`C:\Users\YourName\Pictures`) 2. **自动执行重命名** 代码会执行以下操作: - 第一步:将所有图片文件重命名为临时文件名(使用UUID保证唯一性) - 第二步:将临时文件按`0001, 0002...`格式重命名 3. **安全机制** - 使用两阶段重命名避免文件覆盖 - 支持常见图片格式(可自行扩展`image_exts`元组) - 错误发生时提供明确提示 ### 扩展建议 -修改位数:将`{index:04d}`中的`4`改为其他数字(如`05d`表示5位编-修改排序方式:将`image_files.sort()`改为按修改时间排序: ```python image_files.sort(key=lambda x: os.path.getmtime(os.path.join(folder_path, x))) ``` ### 效果示例 输入文件夹包含: ``` photo1.jpg IMG_2023.png old_pic.gif ``` 运行后输出: ``` 成功:temp_5b9f8a...jpg -> 0001.jpg 成功:temp_7c3e1d...png -> 0002.png 成功:temp_2a8f4b...gif -> 0003.gif ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值