Как удалить файлы по имени в Python?

Как удалить файлы по имени в Python?

Как удалить файлы по имени в Python?

При работе с большим количеством данных может возникнуть необходимость удалить некоторые файлы прямо из питоновской программы! Например, случай из практики: среди фотографий с женскими лицами затесались фото бородатых мужчин. Как они там оказались — вопрос риторический, а вот как удалить файлы по имени в Python прямиком из программы — уже вопрос насущный, который мы сейчас научимся решать!

Для примера рассмотрим очень маленький датасет со схожей проблемой. Итак, внимание..

Описанный ниже способ отлично работает в Python, начиная с 3.4 версии!

Исходные даннные:

1. Датасет с фотографиями женских лиц, среди которых находится несколько лишних «бородатых» фото:

удалить файлы по имени в Python

При желании и во имя тренировки датасет можно скачать по ссылке: Photos.zip.

2. Список с именами лишних фото men_list = [«4.jpg», «9.jpg», «14.jpg»]

Что нужно сделать?

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

Решение:

1. Определим путь к рабочей директории

Пусть все фото располагаются в папке под названием «photos», а питоновский файл с кодом находится в одной директории с папкой «photos».

Тогда абсолютный путь к папке «photos» будет иметь вид — pathlib.Path.cwd():

# импортируем модуль pathlib для работы с путями к файлам
import pathlib
# импорт класса Path модуля pathlib
from pathlib import Path

# получаем объект пути с текущим каталогом
photos_path = pathlib.Path.cwd()

В результате работы метода pathlib.Path.cwd() в переменной photos_path будет сохранен объект абсолютного пути к директории с текущим питоновским файлом и папкой photos.

2. Определим список с именами лишних файлов

import pathlib
from pathlib import Path
photos_path = pathlib.Path.cwd()

# Определим список с именами лишних файлов
men_list = ['4.jpg', '9.jpg', '14.jpg']

3. Реализуем поочередное удаление файлов

Пробегая по списку men_list в цикле for, поочередно проверим, существует ли в текущей директории в папке «photos» файл с указанным именем. Если такой файл существует, то удалим его с помощью метода Path.unlink() и выведем сообщение об успешном удалении. В противном случае, если файл с таким именем не найден, выведем сообщение о его отсутствии:

import pathlib
from pathlib import Path
photos_path = pathlib.Path.cwd()

Определим список с именами лишних файлов
men_list = ['4.jpg', '9.jpg', '14.jpg']

# поочередно проходим по элементам списка men_list
for file_name in men_list:
    # определяем путь к текущему файлу с именем file_name
    file_path = Path(photos_path, 'photos', file_name)
    # если файл по пути file_path существует, 
    if Path.exists(file_path):
        # удаляем его и выводим сообщение об успешном удалении
        Path.unlink(file_path)
        print('Файл успешно удален: ' + str(file_path))
    # если файла, на который указывает путь file_path, не существует,
    else:
        # выводим сообщение об отсутствии файла
        print('Нет такого файла: ' + str(file_path))

Рассмотрим приведенный выше код немного подробнее:

В этом небольшом куске кода принимали участие 3 важных персоны:

1. Экземпляр класса Path. В нашем случае объект класса Path, хранящийся в переменной file_path, содержит абсолютный путь до файла с именем file_name. Так как файл с кодом расположен в той же директории, что и папка photos со всеми фотографиями, то путь к нужному нам файлу будет иметь вид:

абсолютный_путь_к_директории_с_кодом_и_папкой_photos\'photos'\'имя_файла_который_нужно_удалить.jpg'

Слеши, кстати, в разных операционных системах могут иметь разный наклон. Но при создании объекта Path не нужно отвлекаться на проверку слешей, достаточно лишь перечислить части пути к файлу через запятую:

file_path = Path(абсолютный_путь_к_директории_с_кодом_и_папкой_photos, 'photos', 'имя_файла_который_нужно_удалить.jpg')

или (что идентично):

file_path = Path(photos_path, 'photos', file_name),

если photos_path равен абсолютному пути к директории с кодом и папкой photos, а file_name содержит имя файла, который нужно удалить.

В результате получим переменную file_path, содержащую абсолютный путь до файла с именем file_name.

2. Метод exists() класса Path.

Метод-разведчик, проверяющий, существует ли переданный в качестве параметра путь. Возвращает True или False в зависимости от того, будет ли найден указанный путь. Таким образом, выражение:

Path.exists(file_path)

вернет True, если найдет файл по адресу file_path, в противном случае вернет False.

3. Метод unlink() класса Path

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

Path.unlink(file_path)

Заключительная проверка кодакак удалить файлы по имени в Python:

Ниже размещен полный текст с кодом:

# импортируем модуль pathlib для работы с путями к файлам
import pathlib
# импорт класса Path модуля pathlib
from pathlib import Path

# получаем объект пути с текущим каталогом
photos_path = pathlib.Path.cwd()
# Определим список с именами лишних файлов
men_list = ['4.jpg', '9.jpg', '14.jpg']

# поочередно проходим по элементам списка men_list
for file_name in men_list:
    # определяем путь к текущему файлу с именем file_name
    file_path = Path(photos_path, 'photos', file_name)
    # если файл по пути file_path существует, 
    if Path.exists(file_path):
        # удаляем его и выводим сообщение об успешном удалении
        Path.unlink(file_path)
        print('Файл успешно удален: ' + str(file_path))
    # если файла, на который указывает путь file_path, не существует,
    else:
        # выводим сообщение об отсутствии файла
        print('Нет такого файла: ' + str(file_path))

Папку с файлами для тренировки можно скачать по ссылке: Photos.zip.

Для успешной работы размещенного выше кода нужно, чтобы питоновский файл с кодом был расположен в одной директории с папкой photos!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *