переименовать изображения с двумя разными именами в определенном порядке - PullRequest
1 голос
/ 07 марта 2019

Мне нужно переименовать 992 имени изображения в папке с Python. Название изображений должно меняться в зависимости от их порядка. Например

 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, но проблема в том, что новое имя начинается с 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'))

enter image description here

1 Ответ

1 голос
/ 08 марта 2019

Причина, по которой он в настоящее время начинается с 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'))

Результат (из кода (не показан), где исходное имя файла добавляется к новому имени файла):

Screenshot

...