Время прочтения: 3 мин.

Отсутствие организованного хранения загруженных файлов на информационном ресурсе или на жестком диске компьютера может порой существенно осложнить понимание того, какие типы данных и в каком объеме у вас накоплены, а также увеличить время на классификацию форматов и их упорядочивание, если делать это «руками».

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

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

Вот фрагмент, как выглядел каталог перед запуском кода:

В коде использован:

  • модуль glob – возвращает список файлов, определяемых с помощью регулярного выражения;
  • модуль Shutil – перемещение файлов;
  • модуль os – обработка имен файлов.

Импорт модулей:

import glob
import shutil
import os

Необходимо создание словаря, в котором расширения файлов будут сопоставлены с каталогами. Таких пар может быть много, в зависимости от накопленных данных. Определенные типы файлов необходимо размещать по «своим» каталогам: документы, изображения, исполняемые файлы и т.д. Для примера показано некоторое количество расширений.

# Сопоставление расширений файлов соответствующим создаваемым каталогам
exts = {
    "exe": "Исполняемые файлы",
    "sql": "SQL-код",
    "png": "Изображения",
    "jpg": "Изображения",
    "rar": "Архивы",
    "zip": "Архивы",
    "xlsx": "Книги Excel",
    "pdf": "Документы PDF",
    "csv": "CSV-файлы",
    "rtf": "Документы Word",
    "docx": "Документы Word",
    "txt": "Файлы TXT",
    "mhtml": "Web-страница",
    "pptx": "Презентации",
    "py": "Python-файл",
    "ipynb": "IPython Notebook"
}

Далее, перейду к основному коду.

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

# Каталог с файлами
path = r"D:\Локальные документы\Загрузки"
# Подробная информация о перемещенных файлах – 1, общая информация - 0
verbose = 1
for ext, foldername in exts.items():
    # Получаем файлы, соответствующие расширениям
    files = glob.glob(os.path.join(path, f"*.{ext}"))
    print(f"[*] Found {len(files)} files with {ext} extn")
    if not os.path.isdir(os.path.join(path, foldername)) and files:
        # Создаем каталог для заданного расширения
        print(f"[+] Making {foldername} folder")
        os.mkdir(os.path.join(path, foldername))
    for file in files:
        # Переместить файл с определенным расширением в соответствующий каталог
        basename = os.path.basename(file)
        dst = os.path.join(path, foldername, basename)
        if verbose:
            print(f"[*] Moving {file} to {dst}")
            shutil.move(file, dst)

Если необходима только общая информация в выводе кода (количество найденных с определенным расширением файлов и создаваемый для них каталог), то ненобходимо присвоить verbose значение 0. Вот результат:

В случае необходимости получить подробный отчет – verbose=1. Тогда будет отображаться информация по каждому перемещенному файлу.

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

Надеюсь, что мой опыт будет вам полезен.