Найти в Дзене
IT Start | Python

Автоматизация задач с помощью Python

В данной статье напишем три скрипта для автоматизации задач с помощью Python. Бывают такие ситуации, когда необходимо отсортировать файлы по папкам, а это слишком муторно, да и заниматься этим честно говоря не хочется. Решить данную проблему можно простым скриптом на Python, который мы сейчас и напишем. Для этого даже устанавливать никакие библиотеки не придётся, т.к. в нём используются стандартные библиотеки Python. Первым делом импортируем модуль shutil, а также класс Path из pathlib: from pathlib import Path
import shutil Создадим словарь «Карта категорий», где имя_папки -> список расширений (в нижнем регистре): from pathlib import Path
import shutil # Карта категорий: имя_папки -> список расширений (в нижнем регистре)
CATEGORY_MAP = {
"Изображения": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],
"Документы": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".pptx", ".txt", ".md"],
"Архивы": [".zip", ".rar", ".7z", ".tar", ".gz"],
"Видео": [".mp4", ".mov", ".avi", ".mkv"],
Оглавление
Автоматизация задач с помощью Python
Автоматизация задач с помощью Python

Введение

В данной статье напишем три скрипта для автоматизации задач с помощью Python.

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

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

Написание кода

Первым делом импортируем модуль shutil, а также класс Path из pathlib:

from pathlib import Path
import shutil

Создадим словарь «Карта категорий», где имя_папки -> список расширений (в нижнем регистре):

from pathlib import Path
import shutil

# Карта категорий: имя_папки -> список расширений (в нижнем регистре)
CATEGORY_MAP = {
"Изображения": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],
"Документы": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".pptx", ".txt", ".md"],
"Архивы": [".zip", ".rar", ".7z", ".tar", ".gz"],
"Видео": [".mp4", ".mov", ".avi", ".mkv"],
"Аудио": [".mp3", ".wav", ".flac", ".ogg"],
}

Далее создадим функцию normalize_ext(), которая будет возвращать расширение в нижнем регистре (или пустую строку).

У функции будет присутствовать один параметр, а именно:

  • ext — расширение файла.

from pathlib import Path
import shutil

CATEGORY_MAP = {
"Изображения": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],
"Документы": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".pptx", ".txt", ".md"],
"Архивы": [".zip", ".rar", ".7z", ".tar", ".gz"],
"Видео": [".mp4", ".mov", ".avi", ".mkv"],
"Аудио": [".mp3", ".wav", ".flac", ".ogg"],
}

def normalize_ext(ext: str) -> str:
"""Возвращает расширение в нижнем регистре (или пустую строку)."""
return ext.lower() if ext else ""

Также создадим функцию categorize(), которая будет определять имя категории по расширению файла.

У функции будет присутствовать один параметр, а именно:

  • path — путь к файлу.

from pathlib import Path
import shutil

CATEGORY_MAP = {
"Изображения": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],
"Документы": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".pptx", ".txt", ".md"],
"Архивы": [".zip", ".rar", ".7z", ".tar", ".gz"],
"Видео": [".mp4", ".mov", ".avi", ".mkv"],
"Аудио": [".mp3", ".wav", ".flac", ".ogg"],
}

def normalize_ext(ext: str) -> str:
return ext.lower() if ext else ""

def categorize(path: Path) -> str | None:
"""Определяем имя категории по расширению файла."""
print(path)
ext = normalize_ext(path.suffix)
for cat, exts in CATEGORY_MAP.items():
if ext in exts:
return cat
return None # не нашли категорию

Последняя функция, которую мы создадим будет называться sort_files(). Она будет сортировать файлы по категориям.

У функции будет присутствовать один параметр, а именно:

  • root — путь к папке с файлами, которую необходимо отсортировать.

from pathlib import Path
import shutil

CATEGORY_MAP = {
"Изображения": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],
"Документы": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".pptx", ".txt", ".md"],
"Архивы": [".zip", ".rar", ".7z", ".tar", ".gz"],
"Видео": [".mp4", ".mov", ".avi", ".mkv"],
"Аудио": [".mp3", ".wav", ".flac", ".ogg"],
}

def normalize_ext(ext: str) -> str:
return ext.lower() if ext else ""

def categorize(path: Path) -> str | None:
print(path)
ext = normalize_ext(path.suffix)
for cat, exts in CATEGORY_MAP.items():
if ext in exts:
return cat
return None

def sort_files(root: Path) -> None:

Внутри функции будет находиться цикл for, который будет проходиться по путям к файлам. В цикле первым делом будет идти условие, что если файл не существует, то сработает ключевое слово continue.

from pathlib import Path
import shutil

CATEGORY_MAP = {
"Изображения": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],
"Документы": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".pptx", ".txt", ".md"],
"Архивы": [".zip", ".rar", ".7z", ".tar", ".gz"],
"Видео": [".mp4", ".mov", ".avi", ".mkv"],
"Аудио": [".mp3", ".wav", ".flac", ".ogg"],
}

def normalize_ext(ext: str) -> str:
return ext.lower() if ext else ""

def categorize(path: Path) -> str | None:
print(path)
ext = normalize_ext(path.suffix)
for cat, exts in CATEGORY_MAP.items():
if ext in exts:
return cat
return None

def sort_files(root: Path) -> None:
"""Сортировка файлов по категориям."""
for item in root.iterdir():
print(item)
if not item.is_file():
continue

После условия будет определяться категория файла и при помощи ещё одного условия произведётся проверка на принадлежность файла к какой-либо категории из доступных. Если таковой нет, то сработает ключевое слово continue.

from pathlib import Path
import shutil

CATEGORY_MAP = {
"Изображения": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],
"Документы": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".pptx", ".txt", ".md"],
"Архивы": [".zip", ".rar", ".7z", ".tar", ".gz"],
"Видео": [".mp4", ".mov", ".avi", ".mkv"],
"Аудио": [".mp3", ".wav", ".flac", ".ogg"],
}

def normalize_ext(ext: str) -> str:
return ext.lower() if ext else ""

def categorize(path: Path) -> str | None:
print(path)
ext = normalize_ext(path.suffix)
for cat, exts in CATEGORY_MAP.items():
if ext in exts:
return cat
return None

def sort_files(root: Path) -> None:
"""Сортировка файлов по категориям."""
for item in root.iterdir():
print(item)
if not item.is_file():
continue
cat = categorize(item)
if not cat:
continue # пропускаем неизвестные типы

Далее сформируем полный путь к файлу целевой директории:

from pathlib import Path
import shutil

CATEGORY_MAP = {
"Изображения": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],
"Документы": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".pptx", ".txt", ".md"],
"Архивы": [".zip", ".rar", ".7z", ".tar", ".gz"],
"Видео": [".mp4", ".mov", ".avi", ".mkv"],
"Аудио": [".mp3", ".wav", ".flac", ".ogg"],
}

def normalize_ext(ext: str) -> str:
return ext.lower() if ext else ""

def categorize(path: Path) -> str | None:
print(path)
ext = normalize_ext(path.suffix)
for cat, exts in CATEGORY_MAP.items():
if ext in exts:
return cat
return None

def sort_files(root: Path) -> None:
"""Сортировка файлов по категориям."""
for item in root.iterdir():
print(item)
if not item.is_file():
continue
cat = categorize(item)
if not cat:
continue

# Формируем путь к целевой директории
dest_dir = root / cat
dest_dir.mkdir(exist_ok=True) # Создаем директорию, если её нет

# Формируем полный путь к файлу в целевой директории
dest_path = dest_dir / item.name

Добавим проверку при помощи условия на существование файла с таким именем, после чего переместим файл в соответствующую папку и выведем сообщение об успешном перемещении:

from pathlib import Path
import shutil

CATEGORY_MAP = {
"Изображения": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],
"Документы": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".pptx", ".txt", ".md"],
"Архивы": [".zip", ".rar", ".7z", ".tar", ".gz"],
"Видео": [".mp4", ".mov", ".avi", ".mkv"],
"Аудио": [".mp3", ".wav", ".flac", ".ogg"],
}

def normalize_ext(ext: str) -> str:
return ext.lower() if ext else ""

def categorize(path: Path) -> str | None:
print(path)
ext = normalize_ext(path.suffix)
for cat, exts in CATEGORY_MAP.items():
if ext in exts:
return cat
return None

def sort_files(root: Path) -> None:
"""Сортировка файлов по категориям."""
for item in root.iterdir():
print(item)
if not item.is_file():
continue
cat = categorize(item)
if not cat:
continue

dest_dir = root / cat
dest_dir.mkdir(exist_ok=True)

dest_path = dest_dir / item.name

# Проверяем, не существует ли уже файл с таким именем
if dest_path.exists():
# Если существует, добавляем суффикс _dup
dest_path = dest_dir / f"{item.stem}_dup{dest_path.suffix}"

# Перемещаем файл
shutil.move(str(item), str(dest_path))
print(f"Перемещено: {item.name} -> {dest_dir.name}/")

Осталось добавить точку входа:

from pathlib import Path
import shutil

CATEGORY_MAP = {
"Изображения": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],
"Документы": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".pptx", ".txt", ".md"],
"Архивы": [".zip", ".rar", ".7z", ".tar", ".gz"],
"Видео": [".mp4", ".mov", ".avi", ".mkv"],
"Аудио": [".mp3", ".wav", ".flac", ".ogg"],
}

def normalize_ext(ext: str) -> str:
return ext.lower() if ext else ""

def categorize(path: Path) -> str | None:
print(path)
ext = normalize_ext(path.suffix)
for cat, exts in CATEGORY_MAP.items():
if ext in exts:
return cat
return None

def sort_files(root: Path) -> None:
"""Сортировка файлов по категориям."""
for item in root.iterdir():
print(item)
if not item.is_file():
continue
cat = categorize(item)
if not cat:
continue

dest_dir = root / cat
dest_dir.mkdir(exist_ok=True)

dest_path = dest_dir / item.name

if dest_path.exists():
dest_path = dest_dir / f"{item.stem}_dup{dest_path.suffix}"

shutil.move(str(item), str(dest_path))
print(f"Перемещено: {item.name} -> {dest_dir.name}/")

if __name__ == "__main__":
# Получаем путь к директории от пользователя
user_input = input("Введите путь к папке для сортировки: ").strip()
target_dir = Path(user_input)

# Проверяем корректность введенного пути
if not target_dir.exists() or not target_dir.is_dir():
print("Ошибка: указанная папка не существует или путь неверен.")
else:
sort_files(target_dir) # Запускаем сортировку
print("Готово: файлы отсортированы.")

Автоматическое переименование файлов на Python

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

Написание кода

Первым делом импортируем модуль pathlib:

from pathlib import Path

Создадим функцию rename_files(), которая и будет заниматься переименованием файлов.

У функции будет присутствовать три параметра, а именно:

  • directory — путь к директории с файлами
  • old_substring — подстрока, которую нужно найти
  • new_substring — подстрока, на которую нужно заменить.

from pathlib import Path

def rename_files(directory: str, old_substring: str, new_substring: str) -> None:

Внутри неё, первым делом создадим объект Path для работы с путём к директории. Далее добавим условие для проверки пути директории на существование:

from pathlib import Path

def rename_files(directory: str, old_substring: str, new_substring: str) -> None:
# Создаем объект Path для работы с путем к директории
dir_path = Path(directory)

# Проверяем, существует ли указанный путь и является ли он директорией
if not dir_path.is_dir():
print(f"Ошибка: '{directory}' не является директорией.")
return

При помощи цикла пройдёмся по всем элементам директории. В нём будет производиться проверка, является ли текущий элемент файлом и содержит ли его имя искомую подстроку. Если да, то создаём новое имя файла, заменяя подстроку, также создаём новый путь к файлу с обновленным именем и переименовываем его:

from pathlib import Path

def rename_files(directory: str, old_substring: str, new_substring: str) -> None:
dir_path = Path(directory)

if not dir_path.is_dir():
print(f"Ошибка: '{directory}' не является директорией.")
return

# Итерируемся по всем элементам в директории
for file_path in dir_path.iterdir():
# Проверяем, является ли текущий элемент файлом и содержит ли его имя искомую подстроку
if file_path.is_file() and old_substring in file_path.name:
# Создаем новое имя файла, заменяя подстроку
new_name = file_path.name.replace(old_substring, new_substring)
# Создаем новый путь к файлу с обновленным именем
new_path = file_path.with_name(new_name)
try:
# Пытаемся переименовать файл
file_path.rename(new_path)
print(f"Переименован: {file_path.name} -> {new_name}")
except Exception as e:
# Обрабатываем возможные ошибки при переименовании
print(f"Ошибка при переименовании {file_path.name}: {e}")

Добавим точку входа:

from pathlib import Path

def rename_files(directory: str, old_substring: str, new_substring: str) -> None:
dir_path = Path(directory)

if not dir_path.is_dir():
print(f"Ошибка: '{directory}' не является директорией.")
return

for file_path in dir_path.iterdir():
if file_path.is_file() and old_substring in file_path.name:
new_name = file_path.name.replace(old_substring, new_substring)
new_path = file_path.with_name(new_name)
try:
file_path.rename(new_path)
print(f"Переименован: {file_path.name} -> {new_name}")
except Exception as e:
print(f"Ошибка при переименовании {file_path.name}: {e}")

if __name__ == "__main__":
# Пример использования:
# Замените 'ваш/путь/к/папке' на реальный путь к папке
rename_files(r'ваш/путь/к/папке', 'старое_слово', 'новое_слово')

Сжатие файлов в ZIP-архив с помощью Python

Сжатие данных в ZIP-архивы — один из самых удобных способов уменьшить размер файлов и объединить их для передачи или хранения. Встроенный модуль zipfile в Python позволяет работать с ZIP-архивами без установки дополнительных библиотек.

Написание кода

Для начала импортируем модуль zipfile и класс Path из pathlib:

import zipfile
from pathlib import Path

Создадим функцию create_zip(), которая будет создавать ZIP-архив с указанными файлами.

У функции будет присутствовать три параметра, а именно:

  • folder_path — путь к папке, которую нужно заархивировать
  • archive_name — имя создаваемого ZIP-архива.

import zipfile
from pathlib import Path

def zip_folder(folder_path: str, archive_name: str) -> None:

Внутри неё, первым делом произведём проверку на существование папки:

import zipfile
from pathlib import Path

def zip_folder(folder_path: str, archive_name: str) -> None:
folder = Path(folder_path)

# Проверяем, существует ли указанная папка
if not folder.is_dir():
print(f"Папка '{folder_path}' не найдена.")
return

Далее воспользуемся контекстным менеджером и откроем/создадим ZIP-архив в режиме записи. Циклом рекурсивно пройдёмся по всем файлам в директории и добавим их в итоговый архив:

import zipfile
from pathlib import Path

def zip_folder(folder_path: str, archive_name: str) -> None:
folder = Path(folder_path)

if not folder.is_dir():
print(f"Папка '{folder_path}' не найдена.")
return

# Открываем или создаём ZIP-архив в режиме записи
with zipfile.ZipFile(archive_name, mode="w", compression=zipfile.ZIP_DEFLATED) as archive:
# Рекурсивно обходим все файлы и папки внутри заданной директории
for file_path in folder.rglob("*"):
if file_path.is_file():
# Добавляем файл в архив, сохраняя структуру директорий
archive.write(file_path, arcname=file_path.relative_to(folder))
print(f"Добавлен файл: {file_path}")

print(f"Архив '{archive_name}' успешно создан.")

Осталось добавить точку входа:

import zipfile
from pathlib import Path

def zip_folder(folder_path: str, archive_name: str) -> None:
folder = Path(folder_path)

if not folder.is_dir():
print(f"Папка '{folder_path}' не найдена.")
return

with zipfile.ZipFile(archive_name, mode="w", compression=zipfile.ZIP_DEFLATED) as archive:
for file_path in folder.rglob("*"):
if file_path.is_file():
archive.write(file_path, arcname=file_path.relative_to(folder))
print(f"Добавлен файл: {file_path}")

print(f"Архив '{archive_name}' успешно создан.")

# Пример использования
if __name__ == "__main__":
# Пользователь вводит путь к папке
folder_path = input("Введите путь к папке для сжатия: ").strip()

# Автоматически формируем имя архива из имени папки
archive_name = Path(folder_path).name + ".zip"

# Вызываем функцию архивации
zip_folder(folder_path, archive_name)

Заключение

В ходе статьи мы с Вами написали три скрипта для автоматизации задач при помощи Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂

Мой Telegram канал по Python
Мой YouTube канал