Сортировка файлов по расширениям в разные папки на Python

Сортировка файлов по расширениям в разные папки на Python

Добрый день\вечер. Сегодня разберём как делать автоматическую сортировку файлов по папкам на языке Python. Мы постоянно скачиваем файлы из интернета и сохраняем их. Это сильно загрязняет рабочий стол, загрузки и другие папки. Пришло время положить этому конец!

Мы напишем скрипт, который сортирует файлы по папкам в зависимости от их расширения. В конце статьи я дам варианты по улучшению скрипта и превращения его в настоящую программу. Поехали!

Подготовка к сортировке

Что нам потребуется:

  • Компьютер или ноутбук
  • Редактор кода
  • Python 3.9 и выше

Установка библиотек не потребуется, так как все библиотеки уже есть в базовой версии Python. 

В этот раз не будет делать сложную структуру проекта. Всегда упрощайте ваш код - избавляйтесь от громоздких конструкций в сторону элегантных решений. 

Импорты и папки:

import os
import shutil

Для работы с файлами на Python нам нужны две библиотеки:
- os (для получения информации о файлах), 
- shutil (для высокоуровневого взаимодействия с объектами системы).

Обозначим директорию, которую будем чистить и директорию, в которую будут складываться файлы. В folder_track будет директория, в которой хотим «убраться». В folder_move будет папка с директориями для сортировки:

folder_track = r'C:/Users/user/Desktop'  # папка отслеживания
folder_move = r'C:/Users/user/Desktop'  # папка куда будет переноситься

Скрипт для сортировки

Теперь создаем функцию clean. Будем спускаться вниз по решению и рассматривать что оно делает.

def clean():
    files = os.listdir(folder_track)
    for items in files:
        extension = items.split(".")
        if len(extension) > 1 and (
                extension[1].lower() == "jpg" or
                extension[1].lower() == "png" or
                extension[1].lower() == "svg"):
            file = folder_track + "/" + items
            new_path = folder_move + "/Photos/" + items
            shutil.move(file, new_path)
        elif len(extension) > 1 and (extension[1].lower() == 'avi' or
                                     extension[1].lower() == 'mpg' or
                                     extension[1].lower() == 'gif' or
                                     extension[1].lower() == 'mp4' or
                                     extension[1].lower() == 'mpeg' or
                                     extension[1].lower() == 'mpg' or
                                     extension[1].lower() == 'flac'):
            file = folder_track + "/" + items
            new_path = folder_move + "/Videos/" + items
            shutil.move(file, new_path)
        elif len(extension) > 1 and (extension[1].lower() == 'torrent'):
            file = folder_track + "/" + items
            new_path = folder_move + "/Torrent/" + items
            shutil.move(file, new_path)
        elif len(extension) > 1 and (extension[1].lower() == 'rar' or
                                     extension[1].lower() == 'zip' or
                                     extension[1].lower() == 'jar'):
            file = folder_track + "/" + items
            new_path = folder_move + "/Archive/" + items
            shutil.move(file, new_path)

Для начала работы нам требуется получить список всех файлов: files = os.listdir(folder_track). Дальше перебираем все имена фалов внутри цикла for.

Чтобы получить окончания, мы разделяем строку по точке - extension = items.split(".") и записываем в переменную.

Дальше идет проверка на длину расширения файла и сравнивание с типом (аудио, торрент и архива). 

Если файл проходит хоть одну проверку, мы перемещаем его в папку с этими файлами. В начале соберём путь расположения: file = folder_track + "/" + items. Потом новый путь, где файл будет располагаться: new_path = folder_move + "/Videos/" + items

После всех манипуляций со строками передаем их в shutil.move(file, new_path) - эта функция сделает перенос файл из одного расположения в другое.

Доработка и использование проекта

Чтобы исключить эту топорность в проверке (and or, or, or), можно сделать массив с форматами файлов (например ['avi', 'mpg', 'gif', 'mp4'] и т.д.) и потом искать совпадения с окончаниями имён файлов.

Пример:

video_format = ['mp4', 'mpg', 'avi', 'mpeg']
archive_format = ['rar', 'zip', '7z']
extension = ['asd', 'asdsa']
if len(extension) > 1 and extension[1].lower in video_format:
    file = folder_track + "/" + items
    new_path = folder_move + "/Videos/" + items
    shutil.move(file, new_path)
elif len(extension) > 1 and extension[1].lower in archive_format:
    file = folder_track + "/" + items
    new_path = folder_move + "/Torrent/" + items
    shutil.move(file, new_path)

Тут мы заранее готовим массив форматов файлов и проверяем есть ли окончание файла внутри этого массива с помощью in. Условие сработает если есть совпадения, если нет, то переходит к следующей проверке. Как это выглядит целиком - смотрите в конце статьи.

Анонсы всех видео, статей и полезностей - в нашем Telegram-канале🔥
Присоединяйтесь, обсуждайте и автоматизируйте!

Чтобы наш скрипт не пылился без дела, можно закинуть его в планировщик задач Windows, где он будет регулярно выполняться в выбранное время. Подробнее ознакомиться с функциями планировщика Windows можно в этих видео: тут или тут.

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

Заключение

Это лишь пример как Python может помочь нам в обычной жизни. Работа с файлами и папками на Python - очень полезная область, которую стоит освоить. Я и сам постоянно пользуюсь этим скриптом для поддержки чистоты. Ну а если вы решите оптимизировать этот скрипт или добавить новых полезных функций - будем рады вашим решениям в комментариях к статье;)

Вот как выглядит решение  с проверкой окончания файла из массива:

import os
import shutil

folder_track = r'C:/Users/Redkomel/Desktop'  # папка отслеживания

folder_move = r'C:/Users/Redkomel/Desktop'  # папка куда будет переноситься
video_format = ['mp4', 'mpg', 'avi', 'mpeg']
archive_format = ['rar', 'zip', '7z']
def clean():
    files = os.listdir(folder_track)
    for items in files:
        extension = items.split(".")
        if len(extension) > 1 and (
                extension[1].lower() == "jpg" or
                extension[1].lower() == "png" or
                extension[1].lower() == "svg"):
            file = folder_track + "/" + items
            new_path = folder_move + "/Photos/" + items
            shutil.move(file, new_path)
        elif len(extension) > 1 and extension[1].lower in video_format:
            file = folder_track + "/" + items
            new_path = folder_move + "/Videos/" + items
            shutil.move(file, new_path)
        elif len(extension) > 1 and (extension[1].lower() == 'torrent'):
            file = folder_track + "/" + items
            new_path = folder_move + "/Torrent/" + items
            shutil.move(file, new_path)
        elif len(extension) > 1 and extension[1].lower in archive_format:
            file = folder_track + "/" + items
            new_path = folder_move + "/Archive/" + items
            shutil.move(file, new_path)
clean()

Полезные ссылки

Документация на os: https://docs.python.org/3/library/os.html

Документация на shutil: https://docs.python.org/3/library/shutil.html
 

 

Комментарии