Как объединить изображения из нескольких папок в одну с помощью счетного числа с помощью python

#python #directory #shutil

Вопрос:

Я действительно ищу решение этой проблемы. Я создавал кадры из кода python, которые в итоге оказались в разных папках, как показано ниже,

 **folder names** swimming_0, swimming_1, noswimming_0, noswimming_1.

swimming_0       noswimming_0
frame0.jpg      frame0.jpg
frame1.jpg      frame1.jpg 
frame2.jpg      frame2.jpg

swimming_1       noswimming_1
frame0.jpg      frame0.jpg
frame1.jpg      frame1.jpg 
frame2.jpg      frame2.jpg
 

Чего я ожидаю:

 In a single folder

swimming_0_0.jpg
swimming_0_1.jpg
swimming_0_2.jpg
swimming_1_0.jpg
swimming_1_1.jpg
swimming_1_2.jpg
noswimming_0_0.jpg
noswimming_0_1.jpg
noswimming_0_2.jpg
noswimming_1_0.jpg
noswimming_1_1.jpg
noswimming_1_2.jpg

The steps we need is that: 
1. rename the images in each folder
2. combine the images
 

Используемый код Python:

 step1: renaming and adding incremental numbers
import os

folderpath = r'/swimming'
fileNumber = 1

for filename in os.listdir(folderpath):
os.rename(folderpath   '//'   filename, folderpath     "_"   str(fileNumber))
fileNumber  =1
 

Хотя этот код соответствует моим ожиданиям в отношении шага 1, однако я ищу более эффективный способ сделать это. Не мог бы кто-нибудь, пожалуйста, помочь здесь.

Обновить:

Также хорошо, если мы не будем отслеживать имена файлов, но, по крайней мере, в этом случае я ожидал бы, что результаты будут.

 swimming_0.jpg
swimming_1.jpg
swimming_2.jpg
swimming_3.jpg
swimming_4.jpg
swimming_5.jpg
noswimming_6.jpg
noswimming_7.jpg
noswimming_8.jpg
noswimming_9.jpg
noswimming_10.jpg
noswimming_11.jpg 
 

Комментарии:

1. насколько эффективнее вы хотите, чтобы это было (ПРАВКА: вы могли бы использовать процессы, но это немного перебор для кажущегося небольшого количества изображений, которые вам нужно обработать)? Я имею в виду, вы могли бы использовать enumerate() , так что вам не придется отслеживать fileNumber , как вы делаете сейчас, но что будет сократить код на 2 линии, которые даже не влияют на производительность (я имею в виду, они делают это нравится меньше, чем 0.0000001% или sth), а иначе это уже pertty короткий код, также я не вижу ваши попытки объединения этих изображений, так что ИМО должен быть действительно вопрос, потому что часть1 кода работает уже

2. Привет, но с enumerate мы просто получим цифры, но я хотел бы сохранить префикс и, пожалуйста, проверьте мои ожидаемые результаты. Да, на шаге 2 расчесывания файлов я делаю это вручную, но это не проблема, я также могу сделать это в коде. Но моя проблема связана с шагом 1.

3. хорошо, вы получите числа с перечислением … не можете ли вы преобразовать их в строку и объединить с префиксом? Я предполагаю, что он не перемещает файлы из этих разных папок в ту, которую вы ожидаете

4. @matiis , также хорошо, если бы мы могли получить мои обновленные результаты в соответствии с вашим предложением?.

Ответ №1:

Хорошо, поэтому, если вы хотите переместить файлы в отдельные папки в одну, вы можете попробовать это:

Для начала у вас должна быть такая структура:

 from_here/
      noswimming_0/
          frame0.png
          frame1.png
          frame2.png
      noswimming_1/
          frame0.png
          frame1.png
          frame2.png
      swimming_0/
          frame0.png
          frame1.png
          frame2.png
      swimming_1/
          frame0.png
          frame1.png
          frame2.png
move_here/
script.py
 

script.py:

 import os


from_path = os.getcwd()   '/from_here'
to_path = os.getcwd()   '/move_here'

for folder in os.listdir(from_path):
    for file in os.listdir(os.path.join(from_path, folder)):
        os.rename(os.path.join(from_path, folder, file), os.path.join(to_path, f'{folder}_{file}'))
 

Теперь это должно переместить файлы из этих отдельных папок в одну (очевидно, у вас может быть больше папок для перемещения или больше файлов в этих папках)