Время прочтения: 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. Тогда будет отображаться информация по каждому перемещенному файлу.
Вот так, после работы кода, данные в каталоге Загрузки упорядочены по типу файлов, что позволяет не тратить дополнительное время и сразу переходить к необходимому подкаталогу.
Надеюсь, что мой опыт будет вам полезен.