2016-07-05 2 views
0

Python beginner here.Переименование файлов с рисунком

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

002_IMG_001, 002_IMG_002, 002_IMG_003, 002_IMG_N

Теперь я пытаюсь переименовать эти изображения таким образом, что пять файлы в строке имеют «N» от 1: 5, то есть каждый последовательный набор из пяти изображений получает N, от 1 до 5. Я также хотел бы придерживаться другой строки перед номером «N». Эта строка будет отслеживать набор N изображений, например IMG_001_1, IMG_001_2, .. IMG_001_N, IMG_002_1, IMG_002_2, ... IMG_00X_N.

Псевдокод на питона 2.7.10 на Mac выглядит следующим образом:

import os 

myDir = "/Users/path/to/dir/" 
fileList = os.listdir(myDir) 

for filename in fileList : 
    #split the images into sets of five each 
    newFile = 'IMG_' + '00' + X + '_' + N 
     #loop through images and rename 
      os.rename(fileName, newFile) 

Я думаю, что нужно условие внутри для цикла, Somthing как:

if int(filename[9:12]) % 5 == 0 

, но это будет означать, Я должен создать пять отдельных условий для 1-5, что кажется неправильным. Любой намек был бы оценен?

Редактировать: Не было понятно, какой тип вывода требуется. Я ищу функцию, чтобы получить конечные имена файлов, как: IMG_001_1, IMG_001_2, ... IMG_001_5, IMG_002_1, IMG_002_2, ... IMG_002_5, ...

+0

Я не уверен, если я понимаю, ваши правила переименования. Не могли бы вы привести конкретный пример? –

+0

Так они идут 001 ..., 002 ..., 003 ...? –

+0

Подтвердите, что вы хотите преобразовать это имя файла 002_IMG_001 в то, что именно - поместите этот ответ в свой вопрос не в комментарии – PyNEwbie

ответ

0

Я думаю, что это должно работать:

my_list = ["002_IMG_001", "002_IMG_002", "002_IMG_003", "002_IMG_004", "002_IMG_005", 
     "002_IMG_006", "002_IMG_007", "002_IMG_008", "002_IMG_009", "002_IMG_0010", 
     "002_IMG_011", "002_IMG_012", "002_IMG_013", "002_IMG_014", "002_IMG_015", 
     "002_IMG_016", "002_IMG_017", "002_IMG_018", "002_IMG_019", "002_IMG_0020", 
     ] 
fileList.sort() 

print("Original list:\n") 
print(fileList) 

new_list = [] 

for index, old_file_name in enumerate(fileList): 
    group, subgroup = divmod(index,5) 
    group, subgroup = group + 1, subgroup + 1 
    new_file_name = "IMG_{0:03d}_{1}".format(group, subgroup) 
    new_list.append(new_file_name) 

    os.rename(old_file_name, new_file_name) 

print("\nNew list:\n") 
print (new_list) 

Вот результат:

Original list: 

['002_IMG_001', '002_IMG_002', '002_IMG_003', '002_IMG_004', '002_IMG_005', 
'002_IMG_006', '002_IMG_007', '002_IMG_008', '002_IMG_009', '002_IMG_0010', 
'002_IMG_011', '002_IMG_012', '002_IMG_013', '002_IMG_014', '002_IMG_015', 
'002_IMG_016', '002_IMG_017', '002_IMG_018', '002_IMG_019', '002_IMG_0020'] 

New list: 

['IMG_001_1', 'IMG_001_2', 'IMG_001_3', 'IMG_001_4', 'IMG_001_5', 
'IMG_002_1', 'IMG_002_2', 'IMG_002_3', 'IMG_002_4', 'IMG_002_5', 
'IMG_003_1', 'IMG_003_2', 'IMG_003_3', 'IMG_003_4', 'IMG_003_5', 
'IMG_004_1', 'IMG_004_2', 'IMG_004_3', 'IMG_004_4', 'IMG_004_5'] 
+0

Exatcly выход, который мне нужен. Только один комментарий: нам также нужно получить доступ к исходному имени файла внутри цикла for, чтобы переименовать файлы в конце - возможно, вложенный цикл? Есть ли у вас какие-либо предложения по этому поводу? – wheatSingh

+0

Я только что отредактировал код. Не нужно вставлять другой цикл. См. Ключевое слово «enumerate» в цикле «for». Это делает доступным как индекс, так и элемент списка в цикле «for». У меня есть другое предложение. ListDir может не обязательно перечислять элементы каталога в алфавитном порядке. Вы можете добавить инструкцию "fileList.sort()" перед циклом. Не назначайте ничего этому утверждению. Он сортирует исходный список навсегда. – Joe

+0

Добавлен файл "fileList.sort()", и он работал как шарм. Большое спасибо ! – wheatSingh

Смежные вопросы