【问题标题】:rename images with two different name in specific order按特定顺序重命名具有两个不同名称的图像
【发布时间】:2019-07-29 17:33:31
【问题描述】:

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

 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

...

这是@anki提供的sn-p,与我一起进行了细微的改动,但问题是新名称以ED开头,但它应该是ES。任何帮助将不胜感激。

import os
import glob

path = 'F:/my_data/imagesResized/'
#path = 'F:/my_data/labelsResized/'

fns = glob.glob(path + '*.png')
fns.sort(key = len)
print(fns)

es_or_ed = 'ES'

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{}_{}_{}'.format(i // 6 + 1, es_or_ed, i%3+1) 
    #new_fn = 'P{}_{}_{}_{}'.format(i // 6 + 1, es_or_ed, i%3+1,"label")

    # rename...S
    os.rename(fn, os.path.join(path, new_fn + '.png'))

【问题讨论】:

    标签: python-3.x rename file-rename enumerate


    【解决方案1】:

    目前以 ES 开头的原因是零索引。当i==0 在第一次循环迭代期间,您的代码会将es_or_ed 的值更改为ED

    我修改了您的代码以解决此问题,并执行正确排序的原始文件名,因为您的文件名中似乎没有前导零,并且您希望 10 出现在 9 之后,而不是 1 之后。那里是我从 answer 借来的一个函数,它可以正确地对文件名列表进行排序。

    import os
    import glob
    
    import re
    
    def natural_sort_key(s, _nsre=re.compile('([0-9]+)')):
        return [int(text) if text.isdigit() else text.lower()
                for text in _nsre.split(s)]   
    
    path = 'F:/my_data/labelsResized/'
    
    fns = glob.glob(path + '*.png')
    
    es_or_ed = 'ED'
    
    for i, fn in enumerate(sorted(fns, key=natural_sort_key)):
    
        # Check for ED or ES
    
        if (i+1) % 3 == 1 and es_or_ed == 'ED':
            es_or_ed = 'ES'
    
        elif (i+1) % 3 == 1 and es_or_ed == 'ES':
            es_or_ed = 'ED'
    
        # Create new filename
        new_fn = 'P{}_{}_{}'.format(i // 6 + 1, es_or_ed, i%3+1) 
    
        # rename...S
        os.rename(fn, os.path.join(path, new_fn + '.png'))
    

    结果(来自将原始文件名附加到新文件名的代码(未显示)):

    【讨论】:

    • 感谢您分享此内容。它给了我同样的问题,首先它产生了 ED,但我需要 ES。另外,我确实在开始时更改了 es_or_ed = 'ES' 但仍然是同样的问题。
    • @Neda,你怎么知道你得到的是 ED 而不是 ES?是因为当您在文件夹中查看文件时,文件是如何按名称排序的吗?因为如果是这样,那是因为“D”在字母表中出现在“S”之前。我在新文件名中添加了原始文件名来运行此代码。您可以在我刚刚添加到答案中的屏幕截图中看到您正在寻找的关系就在那里。
    • @Neda,我故意将 es_or_ed(循环前)的初始值更改为“ED”。
    • 我添加了原始图像 image_1 和由您的脚本生成的重命名图像 P1_ED_1,它们并不相同。如果我做错了,则无法通过浏览 992 张图像来找出该图像。任何想法?我希望 image_1 更改为 P1_ES_1 并且两个图像都是相同的
    • @Neda,我的脚本为 image_1 生成的重命名文件是 P1_ES_1,不清楚吗?请比较 image_1 和 P1_ES_1。
    猜你喜欢
    • 2019-07-29
    • 2014-11-12
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2014-01-12
    • 2014-04-26
    相关资源
    最近更新 更多