#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}'))
Теперь это должно переместить файлы из этих отдельных папок в одну (очевидно, у вас может быть больше папок для перемещения или больше файлов в этих папках)