Введение
В данной статье напишем три скрипта для автоматизации задач с помощью 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. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂