Уведомления

Группа в Telegram: @pythonsu

#1 Март 1, 2011 15:22:37

zloymih
От:
Зарегистрирован: 2011-03-01
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт для удаления файлов старше N дней

Здравствуйте. Я сисадмин. Начал изучать питон (версия 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))
Сильно не ругайтесь. Это мой первый опыт работы на питоне :). Спасибо!



Отредактировано (Март 2, 2011 14:29:36)

Офлайн

#2 Март 1, 2011 16:02:57

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт для удаления файлов старше N дней

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))



Офлайн

#3 Март 1, 2011 17:49:06

zloymih
От:
Зарегистрирован: 2011-03-01
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт для удаления файлов старше N дней

Спасибо! То, что нужно. Отредактировал скрипт в первом посте с учетом изменений.



Офлайн

#4 Март 2, 2011 07:05:12

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Скрипт для удаления файлов старше N дней

ловить Exception не политкорректно, правильнее отлавливать конкретное исключение - OSError, в Вашем случае



Офлайн

#5 Март 2, 2011 07:19:39

indus
От:
Зарегистрирован: 2011-02-07
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт для удаления файлов старше N дней

pyuser
ловить Exception не политкорректно, правильнее отлавливать конкретное исключение - OSError, в Вашем случае
не обязательно. конкретное исключение имеет смысл отлавливать только тогда, когда нужна конкретная информация об исключении =) во всех остальных случаях все сливается в /dev/null



Офлайн

#6 Март 2, 2011 07:20:21

zloymih
От:
Зарегистрирован: 2011-03-01
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт для удаления файлов старше N дней

А можно маленький пример по отлову OSError и дальнейшей обработке? Спасибо за замечания - это важно для меня.



Офлайн

#7 Март 2, 2011 07:38:38

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Скрипт для удаления файлов старше N дней

zloymih
А можно маленький пример по отлову OSError и дальнейшей обработке? Спасибо за замечания - это важно для меня.
import traceback

try:
...
except OSError as e:
print("OSError: {} filename {}".format(e.strerror, e.filename))
except:
print(traceback.format_exc())



Офлайн

#8 Март 2, 2011 08:04:48

zloymih
От:
Зарегистрирован: 2011-03-01
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт для удаления файлов старше N дней

Так, поправил скрипт.А в целом нормальный код получился, в стиле питона ? ;)



Офлайн

#9 Март 2, 2011 08:24:30

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Скрипт для удаления файлов старше N дней

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

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

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

P.S. Для первого скрипта не плохо. Даже очень. А то тут иногда такой код показывают, то смотреть страшно…



Отредактировано (Март 2, 2011 08:35:27)

Офлайн

#10 Март 2, 2011 08:46:20

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Скрипт для удаления файлов старше N дней

ZZZ
для создания лога лучше воспользуйся модулем logging
тогда уж и argparse прикрутить :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version