Сортировка фотографий по имени файла в папки в Python

#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 
    )