У каждого из нас в какой-либо из папок скапливается большое количество файлов, рассортировать которые все никак не доходят руки. Мне приходилось наблюдать папку «Загрузки» забитую неимоверным количеством файлов, «Рабочие столы», фото на которых лежит почти друг на друге. И у меня иногда скапливаются файлы, на сортировку которых уходит время. А что, если написать небольшой скрипт на Python, который рассортирует файлы по расширениям и разложит по папкам, попутно удалив пустые директории автоматически? Давайте сделаем это.
Думаю, что не сделаю никаких открытий, сказав, что рассортировать файлы можно с использованием одной библиотеки pathlib, а точнее, ее модуля Path. Каюсь, до недавнего времени, почему-то не обращал на эту библиотеку должного внимания. Может быть потому, что она не представляет из себя ничего экзотического. Но, вот попалась она мне на глаза и попробовав с ней работать я понял, насколько это удобнее, когда идет работа с файлами, чем использовать модуль os. С помощью данного модуля можно получить как полный путь к файлу, так и его расширение, имя, просто путь к папке с файлом и многое другое. А также выполнять базовые операции по удалению, переименованию и перемещению файлов.
Данная заметка, это скорее пример использования данного модуля в практических целях. Ну и кто знает, может быть данный код будет кому-нибудь полезен.
Что потребуется?
Для того, чтобы написать данный скрипт не потребуется скачивать никаких сторонних библиотек, так как библиотека pathlib является предустановленной вместе с Python. Поэтому, нам нужно ее только импортировать в наш скрипт.
Создаем словарь с названиями директорий и расширениями привязанными к ним. Ключом в данном словаре будет название директории, например: «Images», а значением список с расширениями: [".pdf"]. В полном виде данный словарь будет выглядеть вот так:
Конечно же, вы можете самостоятельно добавить директории, а также типы файлов которые нужно будет в них отсортировать. И это, по сути, самая трудоемкая часть данного скрипта.
Теперь создадим функцию, которая на входе будет принимать путь к директории, в которой нужно сортировать файлы. Назову ее: sort_func(path_dir).
Для начала создам переменную, которая будет хранить путь к целевой директории, преобразованной с помощью модуля Path.
Теперь запускаю цикл по целевой директории, из которой, с помощью функции iterdir() получаю список файлов. В данном случае переменная file будет содержать полный путь к файлу в директории.
Затем проверяю, является ли объект полученный в цикле папкой, ведь в директории могут содержаться не только файлы. Проверяю размер папки, и если он равен 0, значит она пустая, а следовательно, ее можно удалить. Что и делается с помощью функции rmdir().
Запускаю еще один цикл, в котором уже перебираю содержимое созданного ранее словаря с директориями и расширениями. Проверяю, содержится ли расширение файла в директории в списке ключа.
Если да, создаем директорию с названием ключа. Здесь не требуется проверки на наличие или отсутствие директории. Все дело в ключе exist_ok=True, который позволяет игнорировать исключение FileExistsError возникающее, если директория уже существует. И затем, перемещаю текущий файл в только что созданную директорию, где в качестве пути, куда перемещать файл указывается имя созданной директории объединенное с именем файла, который нужно переместить.
Полный код функции сортировки файлов:
Ну и код для запуска функции. Для начала запрашиваем у пользователя путь к директории для сортировки. Проверяем, существует ли данная директория. Если нет, сообщаем об этом пользователю. Если да, запускаем функцию сортировки, в которую передаем путь к директории. А по окончании сортировки сообщаем об этом пользователю.
Вот в принципе и все. Хочу сказать, что по удобству работы с файлами данная библиотека намного превосходит библиотеку os. Конечно же, это не говорит о том, что она ее полностью заменяет. Но, могу сказать, что если раньше я, можно сказать, мучился, когда мне нужно было получить расширение файла или его имя без расширения, то теперь, сделать это легко и просто. Одно могу сказать точно, на данную библиотеку нужно было обратить внимание еще раньше.
Но, к моему сожалению, не скажу за всех, но в тех видео и книгах для новичков почему-то очень подробно рассматривается библиотека os, а вот упоминание о pathlib я почти не встречал. По крайней мере, не помню об этом. Встречал данную библиотеку в статьях, но почему-то считал ее сторонней.
Ну и демонстрация работы библиотеки. Вот как выглядела директория до сортировки:
А так уже после:
А на этом, пожалуй, все.
Спасибо за внимание. Надеюсь, что данная информация будет вам полезна
Думаю, что не сделаю никаких открытий, сказав, что рассортировать файлы можно с использованием одной библиотеки pathlib, а точнее, ее модуля Path. Каюсь, до недавнего времени, почему-то не обращал на эту библиотеку должного внимания. Может быть потому, что она не представляет из себя ничего экзотического. Но, вот попалась она мне на глаза и попробовав с ней работать я понял, насколько это удобнее, когда идет работа с файлами, чем использовать модуль os. С помощью данного модуля можно получить как полный путь к файлу, так и его расширение, имя, просто путь к папке с файлом и многое другое. А также выполнять базовые операции по удалению, переименованию и перемещению файлов.
Данная заметка, это скорее пример использования данного модуля в практических целях. Ну и кто знает, может быть данный код будет кому-нибудь полезен.
Что потребуется?
Для того, чтобы написать данный скрипт не потребуется скачивать никаких сторонних библиотек, так как библиотека pathlib является предустановленной вместе с Python. Поэтому, нам нужно ее только импортировать в наш скрипт.
from pathlib import Path
Создаем словарь с названиями директорий и расширениями привязанными к ним. Ключом в данном словаре будет название директории, например: «Images», а значением список с расширениями: [".pdf"]. В полном виде данный словарь будет выглядеть вот так:
Python:
dir_suff_dict = {"Images": ['.jpg', '.jpeg', '.png', '.gif', '.tiff', '.ico', '.bmp', '.webp', '.svg'],
"Documents": [".md", ".epub", ".txt", ".docx", ".doc", ".ods", ".odt", ".dotx", ".docm", ".dox",
".rvg", ".rtf", ".rtfd", ".wpd", ".xls", ".xlsx", ".ppt", ".pptx", ".csv", ".xml"],
"Archives": [".iso", ".tar", ".gz", ".7z", ".dmg", ".rar", ".zip"],
"Audio": [".aac", ".m4a", ".mp3", "ogg", ".raw", ".wav", ".wma"],
"Video": [".avi", ".flv", ".wmv", ".mov", ".mp4", ".webm", ".vob", ".mpg", ".mpeg", ".3gp"],
"PDF": [".pdf"],
"HTML": [".html", ".htm", ".xhtml"],
"EXE_MSI": [".exe", ".msi"],
"PYTHON": [".py", ".pyw"]}
Конечно же, вы можете самостоятельно добавить директории, а также типы файлов которые нужно будет в них отсортировать. И это, по сути, самая трудоемкая часть данного скрипта.
Теперь создадим функцию, которая на входе будет принимать путь к директории, в которой нужно сортировать файлы. Назову ее: sort_func(path_dir).
Для начала создам переменную, которая будет хранить путь к целевой директории, преобразованной с помощью модуля Path.
Python:
cur_dir = Path(path_dir)
Теперь запускаю цикл по целевой директории, из которой, с помощью функции iterdir() получаю список файлов. В данном случае переменная file будет содержать полный путь к файлу в директории.
Python:
for file in cur_dir.iterdir():
Затем проверяю, является ли объект полученный в цикле папкой, ведь в директории могут содержаться не только файлы. Проверяю размер папки, и если он равен 0, значит она пустая, а следовательно, ее можно удалить. Что и делается с помощью функции rmdir().
Python:
if file.is_dir():
if file.stat().st_size == 0:
file.rmdir()
Запускаю еще один цикл, в котором уже перебираю содержимое созданного ранее словаря с директориями и расширениями. Проверяю, содержится ли расширение файла в директории в списке ключа.
Python:
for suff in dir_suff_dict:
if file.suffix.lower() in dir_suff_dict[suff]:
Если да, создаем директорию с названием ключа. Здесь не требуется проверки на наличие или отсутствие директории. Все дело в ключе exist_ok=True, который позволяет игнорировать исключение FileExistsError возникающее, если директория уже существует. И затем, перемещаю текущий файл в только что созданную директорию, где в качестве пути, куда перемещать файл указывается имя созданной директории объединенное с именем файла, который нужно переместить.
Python:
dir_img = cur_dir / suff
dir_img.mkdir(exist_ok=True)
file.rename(dir_img.joinpath(file.name))
Полный код функции сортировки файлов:
Python:
def sort_func(path_dir):
cur_dir = Path(path_dir)
for file in cur_dir.iterdir():
if file.is_dir():
if file.stat().st_size == 0:
file.rmdir()
for suff in dir_suff_dict:
if file.suffix.lower() in dir_suff_dict[suff]:
dir_img = cur_dir / suff
dir_img.mkdir(exist_ok=True)
file.rename(dir_img.joinpath(file.name))
Ну и код для запуска функции. Для начала запрашиваем у пользователя путь к директории для сортировки. Проверяем, существует ли данная директория. Если нет, сообщаем об этом пользователю. Если да, запускаем функцию сортировки, в которую передаем путь к директории. А по окончании сортировки сообщаем об этом пользователю.
Python:
if __name__ == "__main__":
path_d = input('[+] Введите путь к директории для сортировки: ')
if not Path(path_d).exists():
print('[-] Директории не существует')
else:
sort_func(path_d)
print('[!] Сортировка завершена')
Вот в принципе и все. Хочу сказать, что по удобству работы с файлами данная библиотека намного превосходит библиотеку os. Конечно же, это не говорит о том, что она ее полностью заменяет. Но, могу сказать, что если раньше я, можно сказать, мучился, когда мне нужно было получить расширение файла или его имя без расширения, то теперь, сделать это легко и просто. Одно могу сказать точно, на данную библиотеку нужно было обратить внимание еще раньше.
Но, к моему сожалению, не скажу за всех, но в тех видео и книгах для новичков почему-то очень подробно рассматривается библиотека os, а вот упоминание о pathlib я почти не встречал. По крайней мере, не помню об этом. Встречал данную библиотеку в статьях, но почему-то считал ее сторонней.
Ну и демонстрация работы библиотеки. Вот как выглядела директория до сортировки:
А так уже после:
Python:
from pathlib import Path
dir_suff_dict = {"Images": ['.jpg', '.jpeg', '.png', '.gif', '.tiff', '.ico', '.bmp', '.webp', '.svg'],
"Documents": [".md", ".epub", ".txt", ".docx", ".doc", ".ods", ".odt", ".dotx", ".docm", ".dox",
".rvg", ".rtf", ".rtfd", ".wpd", ".xls", ".xlsx", ".ppt", ".pptx", ".csv", ".xml"],
"Archives": [".iso", ".tar", ".gz", ".7z", ".dmg", ".rar", ".zip"],
"Audio": [".aac", ".m4a", ".mp3", "ogg", ".raw", ".wav", ".wma"],
"Video": [".avi", ".flv", ".wmv", ".mov", ".mp4", ".webm", ".vob", ".mpg", ".mpeg", ".3gp"],
"PDF": [".pdf"],
"HTML": [".html", ".htm", ".xhtml"],
"EXE_MSI": [".exe", ".msi"],
"PYTHON": [".py", ".pyw"]}
def sort_func(path_dir):
cur_dir = Path(path_dir)
for file in cur_dir.iterdir():
if file.is_dir():
if file.stat().st_size == 0:
file.rmdir()
for suff in dir_suff_dict:
if file.suffix.lower() in dir_suff_dict[suff]:
dir_img = cur_dir / suff
dir_img.mkdir(exist_ok=True)
file.rename(dir_img.joinpath(file.name))
if __name__ == "__main__":
path_d = input('[+] Введите путь к директории для сортировки: ')
if not Path(path_d).exists():
print('[-] Директории не существует')
else:
sort_func(path_d)
print('[!] Сортировка завершена')
А на этом, пожалуй, все.
Спасибо за внимание. Надеюсь, что данная информация будет вам полезна