【问题标题】:How to rename multiple images into two different names?如何将多个图像重命名为两个不同的名称?
【发布时间】:2019-07-29 03:54:12
【问题描述】:

我需要用 Python 重命名文件夹中 992 图像的名称。图像的名称应根据它们的顺序而改变。例如

current name
image_1 should rename to P1_ES_1
image_2 should rename to P1_ES_2
image_3 should rename to P1_ES_3
image_4 should rename to P1_ED_1
image_5 should rename to P1_ED_2
image_6 should rename to P1_ED_3

接下来的六张图片会重复同样的事情,只是“P”会改变如下:

image_7 should rename to P2_ES_1
image_8 should rename to P2_ES_2
image_9 should rename to P2_ES_3
image_10 should rename to P2_ED_1
image_11 should rename to P2_ED_2
image_12 should rename to P2_ED_3

我已经拥有的 sn-p 将更改名称作为附件显示的前六个图像的名称,这不是我需要的。

这里是sn-p:

import os
import glob

path = 'F:/my_data/imagesResized/'

def rename_files(): 

 j = 1
 i = 1

 for i, filename in enumerate(glob.glob(path + '*.png')): 

    os.rename(filename[:], os.path.join(path, 'P' + str(i) + '_'+ "ES" + '_' + str(j) + '.png'))

    j += 1

if __name__ == '__main__': 

    rename_files() 

【问题讨论】:

    标签: python python-3.x rename enumerate


    【解决方案1】:

    我会做类似的事情

    def build_file_name(files): 
        p_order = 1
        current_e = "ES"
        current_e_order = 1
    
      for file_name in files:
        file_sections =  file_name.split('.')
        file_name = file_sections[0] #this holds file name without extension
        extension = file_sections[1] # this holds extension
        new_file_name = []
        file_order = int(file_name.split('_')[1].strip()) # Incause you're sure that it's always image_{some_number}
    
        current_e_order = current_e_order + 1
    
        new_file_name.append("P" + str(p_order))
        new_file_name.append("_")
        new_file_name.append(current_e)
        new_file_name.append("_")
        new_file_name.append(str(current_e_order))
        new_file_name.append(extension) #append extension back
        if file_order % 6 == 0:
            p_order = p_order + 1
        if file_order % 3 == 0:
            current_e = "ED" if current_e == "ES" else "ES"
            current_e_order = 1
        final_file_name = ''.join(new_file_name) # build normal path now.
    

    【讨论】:

    • 感谢您分享此内容。它会导致错误 file_order = int(file_name.split('_')[1]) # 因为你确定它总是 image_{some_number} ValueError: invalid literal for int() with base 10: 'data/imagesResized\ \image'你能指出我正确的方向吗?
    • 您应该先删除文件扩展名,然后再使用我编写的函数对其进行处理,然后再次附加扩展名。 @Neda 等一下,我将编辑我的答案来证明这一点
    • @Neda 看看。
    • 感谢您编辑代码。我得到了同样的错误。我现在只是将它粘贴在问题上,稍后我将从那里删除。你能指出我哪里做错了吗?
    • @Neda 尝试在 int() 转换中添加 .strip(),检查我编辑的答案
    【解决方案2】:

    最简单的方法是使用modulo 运算符循环浏览您的索引。您使用enumerate 做得对。另一个有趣的事实,使用sorted 使用glob 对图像进行相应的排序,有时文件名是随机排列的:

    fns = sorted(glob.glob(path + '*.png')): 
    
    es_or_ed = 'ED'
    
    for i, fn in enumerate(fns):
        # Check for ED or ES
        if i % 3 == 0 and es_or_ed == 'ES':
            es_or_ed = 'ED'
    
        elif i % 3 == 0 and es_or_ed == 'ED':
            es_or_ed = 'ES'
    
        # Create new filename
        new_fn = 'P{}_{}_{}.png'.format(i // 6 + 1, es_or_ed, i%3+1)
    
        # rename...
        os.rename(fn, os.path.join(path, new_fn))
    

    对于随机图像,这会给你

     old: image_1     new: P1_ES_1
     old: image_2     new: P1_ES_2
     old: image_3     new: P1_ES_3
     old: image_4     new: P1_ED_1
     old: image_5     new: P1_ED_2
     old: image_6     new: P1_ED_3
     old: image_7     new: P2_ES_1
     old: image_8     new: P2_ES_2
     old: image_9     new: P2_ES_3
     old: image_10    new: P2_ED_1
     ...
    

    【讨论】:

    • 我有一个问题,它总是以 ED 开头,但我需要以 ES 开头。你能指出我正确的方向吗?我不知道你如何从 ES 开始新的。另外,我认为有些问题,因为 image_1 与重命名的第一张图片不对应
    • 只需将一开始的es_or_ed 更改为es_or_ed = 'ES' 即可。如果第一个图像不是第一个重命名的图像,只需检查所有内容是否正确排序。首先查看带有print(fns) 的文件,使用我上面的代码创建变量fns
    • 排序已排序,但您的脚本仍将以 ED 开头,而开头是 es_or_ed = 'ES'。没有运气。
    • 我不确定您的情况发生了什么,因为我无法重现此错误。查看在线 Python 工具,这里也可以。也许你可以使用this to spot the error
    猜你喜欢
    • 1970-01-01
    • 2019-07-29
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2022-06-14
    • 2014-08-27
    • 2020-02-06
    相关资源
    最近更新 更多