#python #sorting #photo
#python #сортировка #фото
Вопрос:
Я пытаюсь отсортировать фотографии, расположенные в папке по их имени, в папки с тем же именем.
project/photos_to_sort/
IMG_20200101_001.jpg
IMG_20200101_002.jpg
IMG_20200103_001.jpg
IMG_20200207_001.jpg
IMG_20200207_002.jpg
IMG_20200207_003.jpg
Скрипт должен создать 3 папки с именами: 20200101, 20200103, 20200207, а затем поместить фотографии в правильные папки.
project/sorted/20200101/
IMG_20200101_001.jpg
IMG_20200101_002.jpg
project/sorted/20200103/
IMG_20200103_001.jpg
project/sorted/20200207/
IMG_20200207_001.jpg
IMG_20200207_002.jpg
IMG_20200207_003.jpg
Пока что это мой код, но, похоже, я могу заставить это работать:
import os
import shutil
# Input absolute path to PhotoSort program.
os.chdir("C:\Users\User\Projects\PhotoSort")
for f in os.listdir("photos_to_sort"):
folderName = f[4:12]
if os.path.exists(folderName):
shutil.copy(
os.path.join("C:\Users\User\Projects\PhotoSort\", f),
os.path.join("C:\Users\User\Projects\PhotoSort\sorted\", folderName),
)
else:
os.mkdir(folderName)
shutil.copy(
os.path.join("C:\Users\User\Projects\PhotoSort\", f),
os.path.join("C:\Users\User\Projects\PhotoSort\sorted\", folderName),
)
На данный момент это выдает ошибку FileNotFoundError.
Комментарии:
1. привет, falconed! можем ли мы увидеть ошибку целиком, с точной строкой, на которую она ссылается? таким образом, проблему будет намного легче обнаружить.
2. используйте
os.makedirs
для рекурсивного создания каталога вместоos.makedir
Ответ №1:
Ваше имя папки не является допустимым путем, это просто строка, которую вы должны создать path как sorted / folderName, как вы упомянули. А также ваши фотографии находятся в папке photos_to_sort, и вы используете корневую папку.
И когда вы задаете свой абсолютный путь, используя относительный путь, все становится проще и работает и на других компьютерах.
Лучше всего создавать path с помощью os.path.join, поскольку он создает path в соответствии с базовой операционной системой, чтобы ваш скрипт мог работать как в Windows, так и в Linux / Unix
Ниже приведен рабочий код
import os
import shutil
# Input absolute path to PhotoSort program.
os.chdir("C:\Users\User\Projects\PhotoSort")
for f in os.listdir("photos_to_sort"):
folderName = f[4:12]
if os.path.exists(os.path.join("sorted", folderName)):
shutil.copy(
os.path.join(
"photos_to_sort", f),
os.path.join(
"sorted", folderName),
)
else:
os.makedirs(os.path.join(
"sorted", folderName))
shutil.copy(
os.path.join(
"photos_to_sort", f),
os.path.join(
"sorted", folderName),
)
Ответ №2:
Используйте os.makedirs(folder_name, exist_ok=True)
Это создаст каталог, только если он не существует. Затем вы можете использовать команду shutil copy вместе с вышеупомянутой функцией в цикле for для выполнения задания. Кроме того, проверьте размещение вашего условия if.
dest_path = "C:\Users\User\Projects\PhotoSort\sorted\"
for f in sorted(os.listdir("photos_to_sort")):
folderName = f[4:12]
dest_img_folder = os.path.join(dest_path,folderName)
os.makedirs(dest_img_folder,exist_ok=True)
shutil.copy(
os.path.join("C:\Users\User\Projects\PhotoSort\", f),
os.path.join(dest_img_folder,f), # also specify the absolute file path
)