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

Обновлено: 08.07.2024

Этот материал посвящен выполнению SQL-операции DELETE для SQLite-таблицы из Python-приложения.

В этой статье мы рассмотрим:

  • Удаление одной, нескольких или всех строк или колонок из SQLite-таблицы с помощью Python;
  • Использование запроса с параметрами для выполнения операции удаления из SQLite;
  • Коммит и отмена последней операции;
  • Массовое удаление в один запрос.

Подготовка

Перед выполнением следующих операций нужно знать название таблицы SQLite, а также ее колонок. В этом материале будет использоваться таблица sqlitedb_developers .

Пример удаления одной строки из SQLite-таблицы

Сейчас таблица sqlitedb_developers содержит шесть строк, а удалять будем разработчика, чей id равен 6. Вот что для этого нужно сделать:

  • Присоединиться к SQLite из Python;
  • Создать объект Cursor с помощью полученного в прошлом шаге объекта соединения SQLite;
  • Создать DELETE-запрос для SQLite. Именно на этом этапе нужно знать названия таблицы и колонок;
  • Выполнить DELETE-запрос с помощью cursor.execute() ;
  • После выполнения запроса необходимо закоммитить изменения в базу данных;
  • Закрыть соединение с базой данных;
  • Также важно не забыть перехватить исключения, которые могут возникнуть;
  • Наконец, проверить результат операции.

Вывод: таблица sqlitedb_developers после удаления строки из Python.

Разбор примера в подробностях

  • На этой строке модуль sqlite3 импортируется в программу;
  • С помощью классов и методов sqlite3 можно взаимодействовать с базой данных SQLite.

sqlite3.connect() и connection.cursor() :

  • С помощью sqlite3.connect() устанавливается соединение с базой данных SQLite из Python;
  • Дальше используется sqliteConnection.cursor() для получения объекта Cursor .

После этого создается DELETE-запрос для удаления шестой строки в таблице (для разработчика с id равным 6). В запросе этот разработчик упоминается.

Наконец, закрываются Cursor и SQLite-соединение в блоке finally .

Примечание: если выполняется несколько операций удаления, и есть необходимость отменить все изменения в случае неудачи хотя бы с одной из них, нужно использовать функцию rollback() класса соединения для отмены. Эту функцию стоит применять внутри блока except .

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

В большинстве случаев удалять строки из таблицы SQLite нужно с помощью ключа, который передается уже во время работы программы. Например, когда пользователь удаляет свою подписку, запись о нем нужно удалить из таблицы.

В таких случаях требуется использовать запрос с параметрами. В таких запросах на месте будущих значений ставятся заполнители ( ? ). Это помогает удалять записи, получая значения во время работы программы, и избегать проблем SQL-инъекций. Вот пример с удалением разработчика с id=5 .

Вывод: таблица sqlitedb_developers после удаления строки с помощью запроса с параметрами.

Разберем последний пример:

  • Запрос с параметрами использовался, чтобы получить id разработчика во время работы программы и подставить его на место ? . Он определяет id записи, которая будет удалена.
  • После этого создается кортеж данных с помощью переменных Python.
  • Дальше DELETE-запрос вместе с данными передается в метод cursor.execute() .
  • Наконец, изменения сохраняются в базе данных с помощью метода commit() класса Connection .

Операция Delete для удаления нескольких строк

В примере выше был использован метод execute() объекта Cursor для удаления одной записи, но часто приходится удалять сразу несколько одновременно.

shutil.rmtree() удаляет каталог и все его содержимое.

Path объекты из Python 3.4+ pathlib также предоставляет следующие методы экземпляра:

pathlib.Path.unlink() удаляет файл или символическую ссылку ,

Вы можете использовать встроенный pathlib модуль (требуется Python 3.4+, но есть бэкпорты для более старых версий PyPI: pathlib , pathlib2 ).

Для удаления файла существует метод unlink . :

Или rmdir , чтобы удалить пустая папка:

Синтаксис Python для удаления файла

pathlib Библиотека для версии Python> 3.5

Path.unlink ( missing_ok = False)

Метод Unlink, используемый для удаления файла или символической ссылки.

Если missing_ok равно false (по умолчанию), FileNotFoundError вызывается, если путь не существует.
Если пропущено значение true_ok, исключения FileNotFoundError будут игнорироваться (аналогично команде POSIX rm -f).
Изменено в версии 3.8: добавлен параметр missing_ok.

Лучшая практика

  1. Сначала проверьте, существует ли файл или папка, а затем удалите только этот файл. Это может быть достигнуто двумя способами:
    а. os.path.isfile("/path/to/file")
    б . Используйте exception handling.

ПРИМЕР для os.path.isfile

Обработка исключений

РЕСПЕКТИВНЫЙ ВЫХОД

Синтаксис Python для удаления папки

Пример для shutil.rmtree()

Как удалить файл или папку в Python?

В Python 3 для отдельного удаления файла и каталога используйте unlink и > Path методы объекта соответственно:

Обратите внимание, что вы также можете использовать относительные пути с Path объектами, и вы можете проверить свой текущий рабочий каталог с Path.cwd .

Для удаления отдельных файлов и каталогов в Python 2 см. Раздел, помеченный ниже.

Демонстрация

Новым в Python 3.4 является объект Path .

Давайте использовать один, чтобы создать каталог и файл, чтобы продемонстрировать использование. Обратите внимание, что мы используем / для объединения частей пути, это решает проблемы между операционными системами и проблемы с использованием обратной косой черты в Windows (где вам нужно либо удвоить обратную косую черту, например \\ или используйте необработанные строки, например r"foo\bar" ):

Теперь давайте удалим их. Сначала файл:

Мы можем использовать globbing для удаления нескольких файлов - сначала давайте создадим несколько файлов для этого:

Затем просто переберите шаблон глобуса:

Теперь, демонстрируя удаление каталога:

Что, если мы хотим удалить каталог и все в нем? Для этого варианта использования используйте shutil.rmtree

Давайте воссоздадим наш каталог и файл:

И обратите внимание, что rmdir завершается ошибкой, если он не пуст, поэтому rmtree так удобен:

Теперь импортируйте rmtree и передайте каталог функции:

И мы видим, что все это было удалено:

Python 2

Если вы используете Python 2, есть бэкпорт модуля pathlib с именем pathlib2, который можно установить с помощью pip:

И тогда вы можете псевдоним библиотеки к pathlib

Или просто импортируйте объект Path (как показано здесь):

Если это слишком много, вы можете удалить файлы с помощью os.remove или os.unlink

И вы можете удалить каталоги с помощью os.rmdir :

Обратите внимание, что есть также os.removedirs - он только рекурсивно удаляет пустые каталоги, но может подойти вашему варианту использования.

Shutil.rmtree - это асинхронная функция, поэтому, если вы хотите проверить, когда она завершится, вы можете использовать цикл while .

Я рекомендую использовать subprocess , если написание красивого и удобочитаемого кода - ваша чашка чая:

И если вы не инженер-программист, то, возможно, подумайте об использовании Jupyter; Вы можете просто ввести команды bash:

Традиционно вы используете shutil :

Чтобы избежать TOCTOU проблемы, выделенной Комментарий Эрика Араухо, вы можете поймать исключение для вызова правильного метода:

Поскольку shutil.rmtree() будет удалять только каталоги, а os.remove() или os.unlink() будут удалять только файлы.

Создал функцию для вас, ребята.

Чтобы удалить все файлы в папке

Чтобы удалить все папки в каталоге

(См. Полную документацию по shutil) и / или

(Полная документация по os.)

Для удаления файлов:

Обе функции семантически одинаковы. Эта функция удаляет (удаляет) путь к файлу. Если путь не является файлом и является каталогом, то возникает исключение.

Для удаления папок:

Чтобы удалить целые деревья каталогов, можно использовать shutil.rmtree() . os.rmdir работает только тогда, когда каталог пуст и существует.

Для рекурсивного удаления папок по отношению к родителю:

Он удаляет каждый пустой родительский каталог с собой до родительского, который имеет некоторый контент

Изучаю Python, пытаюсь написать скрипт, который из определенной папки берет файл, который создался поздней других. Как это сделать?

37.8k 10 10 золотых знаков 43 43 серебряных знака 79 79 бронзовых знаков Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа).

Пусть задан какой-то путь:

Нужно получить список файлов по этому пути:

На этом этапе желательно проверить, что список файлов не пустой. Делаем просто if files: , а все что расписано ниже - идет внутри блока if.

Превратим просто список файлов в список файлов с путями:

Функция os.path.join() "прикрепляет" путь к имени файла. В зависимости от системы данная функция вставляет между путем и файлом либо прямой слеш, либо обратный, либо вообще ничего, если слеш уже есть в конце пути.

Оставляем в списке только файлы:

Время создания файла будем определять функцией os.path.getctime() . Нужно найти файл, у которого дата модификации максимальна. Для этого воспользуемся функцией max с дополнительным параметром key , позволяющим задать функцию, которая будет применяться к каждому объекту из списка, минимальное будет определяться по соответствующим возвращаемым значениям:

В других ответах вижу sort либо sorted . Почему не применить его? Все просто: зачем сортировать список (возможно, большой), когда нужно всего лишь один раз пройти по нему и найти максимальное.

37.8k 10 10 золотых знаков 43 43 серебряных знака 79 79 бронзовых знаков os.listdir возвращает имена не только файлов, но также и каталогов. А в вопросе фигурирует именно файл. на Windows, лучше os.path.getctime использовать, чтобы найти файл, который был создан самым последним, а не изменён самым последним. Если использовать os.scandir() , то можно вообще с O(1) (константа) памятью найти файл за O(n) (линейное) время, используя max() @jfs, на практике редко требуется сравнивать дату именно создания файла (хотя, могут быть и такие случаи), поэтому задание понял не так как в нем написано) @insolor: вопрос явно говорит: "файл, который создался поздней других", а не файл, который был модифицировано поздней других. 4,476 13 13 серебряных знаков 15 15 бронзовых знаков os.listdir возвращает имена не только файлов, но также и каталогов. А в вопросе фигурирует именно файл. Решил не делать лишних проверок чтоб не загромождать код. на Unix, getctime() не возвращает время создания, возможно лучше getmtime() использовать (время последнего изменения), чтобы код одинаково между платформами работал. Нет необходимости sorted() использовать, можно max() вместо в этом случае использовать.

..скрипт, который из определенной папки берет файл, который создался поздней других.

Смысл st_ctime зависит от системы:

  • на Windows — это время создания файла
  • на POSIX — это время последнего изменения мета-данных у файла (что может отличаться от даты создания файла)

st_birthtime это время создания файла на некоторых системах таких как FreeBSD.

На Linux некоторые файловые системы такие как ext4 также сохраняют crtime (не путайте с ctime ) -- поэтому, если обязательно нужна именно дата создания, то можно что-то вроде xstat bash функции использовать (она реализована поверх debugfs и stat -- сама по себе stat команда не возвращает Birth time на моей системе).

Чтобы найти файл, который был изменён последним, нужно использовать st_mtime атрибут.

Если сохранить вышеприведённый Питон код в файл last_created.py и положить этот файл куда-нибудь в PYTHONPATH ( sys.path ), то чтобы узнать какой файл был создан последним в папке "здесь путь к папке" , можно выполнить команду:

Если необходимо следить за вновь созданными файлами в папке в реальном времени, то чтобы избежать постоянного перебора всех файлов в папке, можно использовать watchdog библиотеку, которая позволяет эффективно следить за изменениями в файловой системе (выполнять действия в ответ на события) и поддерживает разные платформы. Чтобы установить:

Чтобы выводить на экран любые изменения в заданном дереве директорий:

Вот версия last_created.py , которая поддерживает старые версии Питона (Python 2/3):

На Питоне 2 на Винде, чтобы не иметь проблем с Юникодными именами, следует использовать Unicode Win32 API: GetCommandLineW() , CommandLineToArgvW() (Python 3 делает это автоматически). См. Read Unicode characters from command-line arguments in Python 2.x on Windows. С этим изменением код работает даже, если имена не могут быть представлены в кодировке, используемой в текущей локали (PEP 383) на всех платформах (Python 2/3, Windows/POSIX).

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

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

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

Модуль встроенный, поэтому для работы с ним не нужно ничего устанавливать.

Вывод текущей директории

Для получения текущего рабочего каталога используется os.getcwd() :

os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог. Вот пример вывода:

Создание папки

Для создания папки/каталога в любой операционной системе нужна следующая команда:

После ее выполнения в текущем рабочем каталоге тут же появится новая папка с названием «folder».

Если запустить ее еще раз, будет вызвана ошибка FileExistsError , потому что такая папка уже есть. Для решения проблемы нужно запускать команду только в том случае, если каталога с таким же именем нет. Этого можно добиться следующим образом:

Функция os.path.isdir() вернет True , если переданное имя ссылается на существующий каталог.

Изменение директории

Менять директории довольно просто. Проделаем это с только что созданным:

Еще раз выведем рабочий каталог:

Создание вложенных папок

Предположим, вы хотите создать не только одну папку, но и несколько вложенных:

Это создаст три папки рекурсивно, как показано на следующем изображении:

Создание вложенных папок

Создание файлов

Для создания файлов в Python модули не нужны. Можно использовать встроенную функцию open() . Она принимает название файла, который необходимо создать в качестве первого параметра и желаемый режим открытия — как второй:

w значит write (запись), a — это appending (добавление данных к уже существующему файлу), а r — reading (чтение). Больше о режимах открытия можно почитать здесь.

Переименование файлов

С помощью модуля os достаточно просто переименовать файл. Поменяем название созданного в прошлом шаге.

Читайте также: