Python, удаление всех файлов в папке старше X дней
Я пытаюсь написать python script, чтобы удалить все файлы в папке старше X дней. Это то, что у меня есть до сих пор:
import os, time, sys path = r"c:\users\%myusername%\downloads" now = time.time() for f in os.listdir(path): if os.stat(f).st_mtime < now - 7 * 86400: if os.path.isfile(f): os.remove(os.path.join(path, f))
Когда я запускаю script, я получаю: Error2 - system cannot find the file specified , и он дает имя файла. Что я делаю неправильно?
7 ответов
os.listdir() возвращает список голой имени файла. У них нет полного пути, поэтому вам нужно объединить его с контуром содержащего каталога. Вы делаете это, когда вы идете, чтобы удалить файл, но не когда вы stat файл (или когда вы делаете isfile() ). Самое простое решение - просто сделать это один раз в верхней части цикла:
Теперь f - это полный путь к файлу, и вы просто используете f всюду (измените ваш вызов remove() , чтобы просто использовать f ).
Нужно ли мне указывать путь, когда я объявляю f или что вы имеете в виду? Я объявил f в начале, как вы рекомендовали, но теперь он хочет, чтобы я объявил путь для os.path. Или я не понимаю, что вы имеете в виду?
Как я уже сказал, в верхней части вашего цикла (т. Е. Сразу после оператора for ) поместите оператор, который я вам дал. Я не могу сказать это проще.
Хорошо, я объявил это не в том месте. Таким образом, он должен выглядеть как f в os.listdir (путь): f = os.path.join (путь, f) Это правильно?
Здравствуйте, здорово видеть, что люди уже подумали о том, что я думаю. Одно маленькое дополнение. Как получить в python количество затронутых папок, чтобы можно было отправлять электронную почту в конце операции? Спасибо
Вам также нужно указать путь, или он будет выглядеть в cwd. что иронически было достаточно, если вы сделали на os.remove , но не где еще.
for f in os.listdir(path): if os.stat(os.path.join(path,f)).st_mtime < now - 7 * 86400:
Хорошо, я больше не получаю сообщение об ошибке, но теперь кажется, что это займет некоторое время или фактически не удалит мои файлы старше 7 дней. Моя математика неверна или мне нужно как-то устанавливать разрешения?
Вы также изменили os.isfile ? или это будет иметь значение false . (или просто сделать так, как рекомендовано kindall, и изменить f, чтобы он включал путь . )
Так я должен был объявить f в начале? Уч. Это мой самый первый скрипт на Python, я читаю курс, но учусь лучше.
Я думаю, что новая pathlib вещь вместе с модулем стрелка для дат для более чистого кода.
from pathlib import Path import arrow filesPath = r"C:\scratch\removeThem" criticalTime = arrow.now().shift(hours=+5).shift(days=-7) for item in Path(filesPath).glob('*'): if item.is_file(): print (str(item.absolute())) itemTime = arrow.get(item.stat().st_mtime) if itemTime < criticalTime: #remove it pass
- pathlib позволяет легко перечислить содержимое каталога, получить доступ к таким характеристикам файла, как время создания и получить полные пути.
- стрелка упрощает и упрощает расчеты времени.
Здесь вывод показывает полные пути, предлагаемые pathlib. (Не нужно присоединяться.)
C:\scratch\removeThem\four.txt C:\scratch\removeThem\one.txt C:\scratch\removeThem\three.txt C:\scratch\removeThem\two.txt
Простой python script для удаления/регистрации/файлов старше 10 дней
#!/usr/bin/python # run by crontab # removes any files in /logs/ older than 10 days import os, sys, time from subprocess import call def get_file_directory(file): return os.path.dirname(os.path.abspath(file)) now = time.time() cutoff = now - (10 * 86400) files = os.listdir(os.path.join(get_file_directory(__file__), "logs")) file_path = os.path.join(get_file_directory(__file__), "logs/") for xfile in files: if os.path.isfile(str(file_path) + xfile): t = os.stat(str(file_path) + xfile) c = t.st_ctime # delete file if older than 10 days if c < cutoff: os.remove(str(file_path) + xfile)
С помощью __file__ вы можете заменить свой путь.
вау, так что если этот скрипт делает то, что я думаю, то я попробую. по сути, я хотел, чтобы из одного каталога было удалено что-либо старше 14 дней, и ему был назначен подстановочный знак (.mov), а другой каталог снова удалил что-либо старше 10 дней с той же самой подстановочной картой (.mov), что имеет смысл? Огромное спасибо.
Это удаляет файлы старше 60 дней.
import os directory = '/home/coffee/Documents' os.system("find " + directory + " -mtime +60 -print") os.system("find " + directory + " -mtime +60 -delete")
хотел бы добавить то, что я придумал, чтобы выполнить эту задачу. функция вызывается в процессе входа в систему.
def remove_files(): removed=0 path = "desired path" # Check current working directory. dir_to_search = os.getcwd() print "Current working directory %s" % dir_to_search #compare current to desired directory if dir_to_search != "full desired path": # Now change the directory os.chdir( desired path ) # Check current working directory. dir_to_search = os.getcwd() print "Directory changed successfully %s" % dir_to_search for dirpath, dirnames, filenames in os.walk(dir_to_search): for file in filenames: curpath = os.path.join(dirpath, file) file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath)) if datetime.datetime.now() - file_modified > datetime.timedelta(hours=1): os.remove(curpath) removed+=1 print(removed)
Ещё вопросы
- 1 почему event.target не запускается в следующем коде, пока работает простой обработчик события click?
- 0 Обработка выражения вне повторения в ng-классе
- 0 .HTACCESS - Дамп сайт от производства до разработки
- 0 передача массива в предложении where в соединении
- 0 C ++ Получение неопределенной ошибки символа
- 1 Найти тип изображения из потока памяти
- 1 Линейный график D3 JS начинается с 0
- 1 Составить 2d массив списка точек
- 1 Должны ли похожие тестовые случаи jUnit находиться в одном тесте?
- 1 Проблема задержки в нескольких графиках, SVG или HTML5 Canvas?
- 0 Android с PHP веб-сервисом
- 0 Угловая лучшая практика. Действия контроллера, запускающие анимацию
- 0 Тестирование углового модала открытое обещание
- 0 Существует ли кроссплатформенная библиотека для событий файловой системы?
- 0 Что я делаю не так с функцией ввода?
- 0 Codeigniter возвращает false из моделей
- 1 Как получить имя схемы для sysobjects при запросе базы данных сервера sql
- 0 Уравнение строки процесса с именами переменных без знака $
- 1 ASP.Net MVC длительный процесс
- 1 Горизонтальное ограничение зрения в ConstraintLayout
- 1 Ошибка параметров ограниченного типа Java
- 1 Почему рендеринг textField с поведением занимает так много времени
- 0 сохранить изменения из таблицы JSP в базу данных
- 1 Как просмотреть HTML-файл в частичном представлении ASP.NET MVC (не Razor)
- 1 Попытка перенести старый алгоритм шифрования на C #
- 0 Вырезать первый символ из элемента абзаца, заменить содержимое и добавить класс. JQuery
- 0 Laravel Digital Ocean Ошибка в обработчике исключений
- 1 Невозможно отправить настраиваемое поле, которое расширяет представление данных
- 0 Используйте поиск с атрибутом данных
- 1 построить динамический массив для charts.js
- 1 Остановить запись звука - Java
- 1 отображение списка возможностей программы
- 1 Firebase OrderByChild () и EqualTo () не работает должным образом
- 0 Выбрать все данные из второй таблицы, где имя равно значению столбца из первой таблицы
- 0 функция slideToggle работает отдельно
- 0 Скопируйте вывод qDebug ()
- 1 Наследование Java - моделирование нескольких объектов
- 1 Получить все документы с помощью GridFSOperations
- 0 Создать сообщение об успешной отправке формы php
- 1 Bluetooth получает данные от HC05 не работает. Я получаю эти данные мусора ����
- 1 Цикл проектов в решении в MSBuild
- 0 Синтаксическая ошибка MySQLi / PHP
- 1 Как раздеть рисунок в струне?
- 0 Не могу показать модальное изображение заголовка с Angularjs
- 1 Как будет работать абстрактный метод рендеринга? (Ява)
- 0 SFINAE выбор перегрузки для имеет или не имеет оператора
- 0 выберите для обновления дважды к той же таблице ключом diffrenet, вызывающим взаимоблокировку в MySQL
- 1 Как остановить повторяющиеся значения в цикле?
- 0 Как мне сопоставить динамический маршрут в базе данных?
Как удалять старые файлы на python
Admin
05.12.2020
Python
Будем удалять файлы из директории, если их больше определенного количества.
Функция сбора файлов в папке
def get_files ( path ) :
files = [ ]
directory = os . listdir ( path )
directory. sort ( reverse = True )
for file in directory:
if file . endswith ( '.jpg' ) :
files. append ( file )
return files
Будем считать, что наши файлы были сохранены через timestamp. Пример есть в статье оптимизация скриншотов на python. Это нужно для их правильной сортировки.
Функция удаления старых файлов
Мы будем удалять файлы, если их будет становится больше 30 штук. Старые будут удаляться в первую очередь.
def remove_old_files ( path , files ) :
""" Оставляет последние 30 файлов, остальные удаляет """
max_files = 30
if len ( files ) < max_files:
return
i = 0
for f in files:
i + = 1
if i > max_files:
os . remove ( os . path . join ( path , f ) )
Использование
Читайте также
У сайта нет цели самоокупаться, поэтому на сайте нет рекламы. Но если вам пригодилась информация, можете лайкнуть страницу, оставить комментарий или отправить мне подарок на чашечку кофе.