Python вложенных циклов для переименования файлов - PullRequest
0 голосов
/ 10 июля 2020

Я хотел бы переименовать файл с помощью os.rename () следующим образом:

x_y.jpg 

x должно быть из списка ['2', '3', '4', '5', '8', '9', '10'].

y следует считать от 1 до 10. После достижения 10, x должен перейти ко второму числу в списке (здесь: '3'), а y должен снова начать подсчет. Примерно так:

2_1.jpg
2_2.jpg
2_3.jpg
...
3_1.jpg
3_2.jpg

Я думаю, что лучше всего будет построить вложенный l oop, но я не уверен, как это сделать, потому что я новичок с python. Я подумал о что-то вроде этого, но это не работает должным образом. Переименовывается только первый файл. Затем появляется ошибка о том, что файл уже существует.

my_list = ['2', '3', '4', '5', '8', '9', '10']
included_extensions = ['jpg', 'JPG']
directory = [fn for fn in os.listdir(source_folder)
              if any(fn.endswith(ext) for ext in included_extensions)]

for y, file in enumerate(directory):
    for x in range(10):
        for x in my_list:
            os.rename(os.path.join(source_folder,file), os.path.join(destination_folder, ''.join([str(x),'_',str(y+1),'.jpg'])))

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Вам понадобится только один для l oop. Вы хотите переименовать каждый файл только один раз, и, следовательно, вам нужно будет только один раз перебрать имена файлов.

Чтобы перебирать разные типы имен, которые вы хотите, вы можете вместо этого использовать индекс из перечисления. Например - используя

for z, file in enumerate(directory):

каждый раз, когда достигается новый файл, ваши значения «x» и «y» могут быть оценены как

this_x = my_list[z // 10]
this_y = z % 10

, чтобы получить что-то вроде


for z, file in enumerate(directory):
    newName = str(my_list[z // 10]) + '_' + str(z % 10) + '.jpg'
    os.rename(os.path.join(source_folder,file), os.path.join(destination_folder, newName))
    fileCount += 1

0 голосов
/ 10 июля 2020

Вы перезаписываете x. Также ваши петли не делают то, что им нужно. Перебирая файлы в первом l oop, ваш внутренний l oop будет иметь одно и то же имя файла для каждого запуска, поэтому после первого запуска файл будет переименован, и второй запуск не сможет получить к нему доступ.

for y, file in enumerate(directory):
    for x in range(10):    # first  x
        for x in my_list:  # second x
            os.rename(os.path.join(source_folder,file), os.path.join(destination_folder, ''.join([str(x),'_',str(y+1),'.jpg'])))

Кроме того, использование вложенных циклов - это неплохая идея, но тогда вам нужно сделать

i = 0
for y in my_list:
    for x in range(10):
        os.rename(os.path.join(source_folder, directory[i]), os.path.join(destination_folder, '{}_{}.jpg'.format(y, x)))
        i += 1

Для перехода y, когда x дойдет до 10. Я бы определил переменная i, чтобы отслеживать, какой файл будет следующим, и делать i += 1 после каждого переименования, и таким образом вам может потребоваться условие выхода, когда список directory доходит до конца.

...