Добрый день\вечер. Сегодня разберём как делать автоматическую сортировку файлов по папкам на языке 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
Комментарии