Найти - Пользователи
Полная версия: Скрипт для удаления файлов старше N дней
Начало » Python для новичков » Скрипт для удаления файлов старше N дней
1 2 3
zloymih
Здравствуйте. Я сисадмин. Начал изучать питон (версия 3.2). Написал скрипт для удаления файлов старше заданного числа дней. Подскажите, как сделать, чтобы дата в логе выводилась красиво (без .281000 в конце) и про обработку исключений (например нет доступа к файлу) расскажите вкратце что-нибудь (желательно простенький пример).
лог
#!C:/Python32/python.exe
# -*- coding: utf-8 -*-
import os
import sys
import datetime
import string
import logging
import argparse

parser = argparse.ArgumentParser(description='Deletes files older than N days.')
parser.add_argument('rootdir', metavar='DirRoot', help='Folder with files')
parser.add_argument('dayold', metavar='N', type=int, help='Number of days')
parser.add_argument('-l','--logfile', metavar='LogFile',default='log.txt', help='Log file')
parser.add_argument('-c','--column', metavar='C',type=int,default=60, help='Column Width')

args = parser.parse_args()

rootdir = args.rootdir
dayold = args.dayold
logfile = args.logfile
columnw = args.column
dnow = datetime.datetime.now()


logging.basicConfig(level = logging.DEBUG,
format = '%(asctime)s {%(filename)s} %(levelname)s: %(message)s',
datefmt = '%Y-%m-%d %H:%M:%S',
filename = logfile,
filemode='a')

console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s {%(filename)s} %(levelname)s: %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
#logging.info('')
logger1 = logging.getLogger('myapp.area1')


if not os.path.exists(rootdir) :
sys.exit('Missing folder: %s' % rootdir)

fileList = []
for root, subFolders, files in os.walk(rootdir):
for file in files:
fileList.append(os.path.join(root,file))


for file in fileList:
try:
dmodify = datetime.datetime.fromtimestamp(os.path.getmtime(file))
days_diff = (dnow-dmodify).days
if days_diff > dayold :
os.remove(file)
logger1.info('%s %s %s deleted',file.ljust(columnw),dmodify.strftime('%Y-%m-%d %H:%M:%S'),days_diff)
else :
logger1.info('%s %s %s',file.ljust(columnw),dmodify.strftime('%Y-%m-%d %H:%M:%S'),days_diff)
except OSError as e:
logger1.error('OSError: {}. File: {}'.format(e.strerror, e.filename))
Сильно не ругайтесь. Это мой первый опыт работы на питоне :). Спасибо!
Studentik
print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

try:
raise Exception("My First Exception")
except Exception as ex:
print("Exception was: '{}:'".format(ex))
zloymih
Спасибо! То, что нужно. Отредактировал скрипт в первом посте с учетом изменений.
pyuser
ловить Exception не политкорректно, правильнее отлавливать конкретное исключение - OSError, в Вашем случае
indus
pyuser
ловить Exception не политкорректно, правильнее отлавливать конкретное исключение - OSError, в Вашем случае
не обязательно. конкретное исключение имеет смысл отлавливать только тогда, когда нужна конкретная информация об исключении =) во всех остальных случаях все сливается в /dev/null
zloymih
А можно маленький пример по отлову OSError и дальнейшей обработке? Спасибо за замечания - это важно для меня.
pyuser
zloymih
А можно маленький пример по отлову OSError и дальнейшей обработке? Спасибо за замечания - это важно для меня.
import traceback

try:
...
except OSError as e:
print("OSError: {} filename {}".format(e.strerror, e.filename))
except:
print(traceback.format_exc())
zloymih
Так, поправил скрипт.А в целом нормальный код получился, в стиле питона ? ;)
ZZZ
indus
не обязательно. конкретное исключение имеет смысл отлавливать только тогда, когда нужна конкретная информация об исключении :) во всех остальных случаях все сливается в /dev/null
Я не понял смысла фразы. Так или иначе, ловить все исключения (или Exception), это очень плохая практика.
Тут куда правильнее отловить только OSError, а во всех остальных случаях просто грохнуться с соответствующим матом. А то наличие реальной ошибки может быть замечено лишь тогда, когда с файлами уже произойдёт нечто страшное. В Дзен на эту тему есть: Errors should never pass silently.
ИМХО, кусок
except:
print(traceback.format_exc())
не нужен. Я понимаю, что он даёт информацию об ошибке, но лучше уж падение. Тем более, что при правильной настройке крона (например) об этом падении сразу станет известно.

Ещё момент… Не надо в try такой здоровый кусок кода вписывать. Нужно только то, где ждёшь эксцепшн. В данном случае, это одна строчка с удалением файла. Такой подход важен для того, чтобы случайно не поймать чужое исключение. В данном случае, если ловить OSError, это не так важно, так так больше неоткуда ему взяться, но всё-таки не надо привыкать к плохому.

zloymih, для создания лога лучше воспользуйся модулем logging. Тут, может, и избыточно, но на будущее пригодится. Я сам админ… :-)

P.S. Для первого скрипта не плохо. Даже очень. А то тут иногда такой код показывают, то смотреть страшно…
pyuser
ZZZ
для создания лога лучше воспользуйся модулем logging
тогда уж и argparse прикрутить :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB