Форум сайта python.su
Здравствуйте. Я сисадмин. Начал изучать питон (версия 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)
Офлайн
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))
Офлайн
Спасибо! То, что нужно. Отредактировал скрипт в первом посте с учетом изменений.
Офлайн
ловить Exception не политкорректно, правильнее отлавливать конкретное исключение - OSError, в Вашем случае
Офлайн
pyuserне обязательно. конкретное исключение имеет смысл отлавливать только тогда, когда нужна конкретная информация об исключении =) во всех остальных случаях все сливается в /dev/null
ловить Exception не политкорректно, правильнее отлавливать конкретное исключение - OSError, в Вашем случае
Офлайн
А можно маленький пример по отлову OSError и дальнейшей обработке? Спасибо за замечания - это важно для меня.
Офлайн
zloymih
А можно маленький пример по отлову OSError и дальнейшей обработке? Спасибо за замечания - это важно для меня.
import traceback
try:
...
except OSError as e:
print("OSError: {} filename {}".format(e.strerror, e.filename))
except:
print(traceback.format_exc())
Офлайн
Так, поправил скрипт.А в целом нормальный код получился, в стиле питона ? ;)
Офлайн
indusЯ не понял смысла фразы. Так или иначе, ловить все исключения (или Exception), это очень плохая практика.
не обязательно. конкретное исключение имеет смысл отлавливать только тогда, когда нужна конкретная информация об исключении :) во всех остальных случаях все сливается в /dev/null
except:
print(traceback.format_exc())
Отредактировано (Март 2, 2011 08:35:27)
Офлайн
ZZZтогда уж и argparse прикрутить :)
для создания лога лучше воспользуйся модулем logging
Офлайн