Python: эффективное переименование файлов в директории

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам нужно быстро переименовать несколько файлов, вам поможет следующий сниппет на Python, использующий модуль os. Допустим, мы хотим добавить префикс "new_" к именам файлов. Вот как это будет выглядеть:

Python
Скопировать код
import os

for filename in os.listdir('.'):
    if filename.endswith('.txt'):
        os.rename(filename, f'new_{filename}')

Этот код выбирает все файлы с расширением .txt в текущей директории и добавляет к их именам префикс "new_". В зависимости от ваших требований вы можете модифицировать условия отбора файлов и способ формирования новых имен.

Кинга Идем в IT: пошаговый план для смены профессии

Продвинутое групповое переименование

Удаление префиксов и предотвращение конфликтов имен файлов

Если вы хотите удалить префикс (например "CHEESE_") из имени файла и при этом не вызвать конфликт перезаписи файлов, используйте следующий код:

Python
Скопировать код
import os

for filename in os.listdir('.'):
    if filename.startswith('CHEESE_'):
        new_filename = filename.replace('CHEESE_', '', 1)
        if not os.path.exists(new_filename):
            os.rename(filename, new_filename)

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

Использование регулярных выражений для обработки сложных шаблонов имен

Для работы со сложными шаблонами имен файлов будет полезен модуль re:

Python
Скопировать код
import os
import re

pattern = re.compile(r'^(CHEESE_)(.*)')

for filename in os.listdir('.'):
    match = pattern.match(filename)
    if match:
        new_filename = match.group(2)
        if not os.path.exists(new_filename):
            os.rename(filename, new_filename)

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

Рекурсивное переименование файлов с помощью os.walk

Чтобы переименовать файлы во всех поддиректориях, используйте функцию os.walk:

Python
Скопировать код
import os

for root, dirs, files in os.walk('.'):
    for filename in files:
        if 'CHEESE_' in filename:
            new_filename = filename.replace('CHEESE_', '')
            original_path = os.path.join(root, filename)
            new_path = os.path.join(root, new_filename)
            if not os.path.exists(new_path):
                os.rename(original_path, new_path)

Этот сниппет обходит все поддиректории, переименовывая файлы и сохраняя историю их предыдущих расположений.

Визуализация

Допустим, у нас в каталоге есть следующие файлы:

Markdown
Скопировать код
🖼️  file1.jpg     🖼️  file2.jpg     🖼️  file3.jpg

Применим Python-скрипт для переименования этих файлов:

Python
Скопировать код
for index, old_name in enumerate(os.listdir(folder)):
    new_name = f"picture_{index}{os.path.splitext(old_name)[1]}"
    os.rename(old_name, new_name)

И теперь файлы выглядят так:

Markdown
Скопировать код
🖼️  picture_0.jpg     🖼️  picture_1.jpg     🖼️  picture_2.jpg

С помощью нашего скрипта на Python мы присвоили файлам новые имена, которые отражают их порядок в списке.

Профессиональные рекомендации и подготовка к будущему

Будьте готовы к возможным ошибкам

Никогда не забывайте обрабатывать возможные ошибки и исключительные ситуации:

Python
Скопировать код
try:
    os.rename(original_path, new_path)
except OSError as e:
    print(f"Error: {e}")

Такой подход поможет вам избежать непредсказуемых проблем и ситуаций, когда файлы могут быть заняты другими процессами.

Современные подходы: применение модуля pathlib

Для эффективного решения задачи переименования файлов рекомендуется использовать модуль pathlib:

Python
Скопировать код
from pathlib import Path

folder = Path('.')

for file_path in folder.glob('*.txt'):
    file_path.rename(f'new_{file_path.name}')

С pathlib получается работать с файловыми шаблонами и структурированными путями гораздо удобнее.

Создайте резервную копию файлов перед началом работы

Бэкап перед важной работой с файлами -- это залог вашего спокойствия:

Python
Скопировать код
import shutil

shutil.copy2(original_path, backup_path)

Резервное копирование поможет вам избежать потери важных данных и не приятных ситуаций, когда что-то идёт не по плану.

Полезные материалы

  1. os — Разнообразные интерфейсы операционной системы — Документация Python 3.12.2
  2. Переименование нескольких файлов в каталоге с помощью Python – Stack Overflow
  3. Как осуществить массовое переименование файлов с использованием Python – GeeksforGeeks
  4. Учебный курс Python: Автоматизация разбора и переименования файлов – YouTube
  5. pathlib — Объектно-ориентированные файловые пути — Документация Python 3.12.2
  6. Автоматизируй скучные вещи с Python
  7. Работа с файлами в Python – Реальный Python