Уведомления

Группа в Telegram: @pythonsu

#1 Март 2, 2011 14:45:09

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

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

Так - хорошо.
console = logging.StreamHandler()
console будет писать в sys.stderr. Это то, что вам нужно?
И, ей-богу, не нужно править каждый раз первое сообщение. Крайне неудобно читать, ускользает суть сделанных изменений. Добавляйте код каждый раз заново.



Офлайн

#2 Март 2, 2011 14:51:22

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

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

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



Офлайн

#3 Март 2, 2011 15:04:15

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

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

Я понимаю. Можно оставить все так, как сейчас.
Еще раз:
console = logging.StreamHandler()
будет писать в sys.stderr, это второй номер. Ну, помните $ ./script > out.txt 2>&1

console = logging.StreamHandler(sys.stdout)
направит лог в первый поток. Что именно требуется - решать вам.



Офлайн

#4 Март 3, 2011 08:33:39

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

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

Конечно лучше выводить в первый поток. Спасибо за подсказку. В справке об этом говорится, я не внимательно прочитал.
окончательный вариант

#!C:/Python32/python.exe

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(sys.stdout)
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))
Всем большое спасибо за помощь.



Офлайн

#5 Март 3, 2011 09:25:47

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

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

zloymih
Конечно лучше выводить в первый поток. Спасибо за подсказку. В справке об этом говорится, я не внимательно прочитал.
окончательный вариант
В целом для скрипта неплохо, но получилось уже довольно длинно, приходится вникать в смысл отдельных блоков. Как дальнейшее улучшение, я бы предложил разбить на отдельные функции. При дальнейших изменениях будет проще и безопаснее модифицировать. Что-то типа:

def parse_arguments():
...
def configure_logging(logname):
...
def delete_old_files(root_dir, daysold, logger):
...

def main():
(root_dir, daysold, logname) = parse_arguments()
logger = configure_logging(logname)
delete_old_files(root_dir, daysold, logger)

if __name__ == '__main__':
main()
А следующий уровень – вообще класс сделать, чтобы с передачей параметров не мучиться :)



Офлайн

#6 Март 3, 2011 09:53:27

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

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

Это, кстати, хорошая мысль про функции :) А классы - это пока для меня очень сложно. ООП - это уже другой уровень. Есть к чему стремиться.



Офлайн

#7 Март 3, 2011 12:02:21

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

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

Не надо пихать ООП туда, где оно не нужно. В данном случае, разбивка на функции будет идеальна.



Офлайн

#8 Март 3, 2011 16:20:04

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

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

Разбил скрипт на функции. Действительно, стало симпатишней :)

#!C:/Python32/python.exe

import os
import sys
import datetime
import string
import logging
import argparse


def parse_arguments():
parser = argparse.ArgumentParser(description='Deletes files older than N days')
parser.add_argument('rootdir', metavar='DirRoot', help='Folder with files')
parser.add_argument('daysold', 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()

return args.rootdir, args.daysold, args.logfile, args.column


def configure_logging(logfile):
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(sys.stdout)
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s {%(filename)s} %(levelname)s:%(message)s')
console.setFormatter(formatter)
logging.getLogger().addHandler(console)
#logging.info('')
return logging.getLogger('myapp')


def delete_old_files(rootdir, daysold, columnw, logger):
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))

dnow = datetime.datetime.now()

for file in fileList:
try:
dmodify = datetime.datetime.fromtimestamp(os.path.getmtime(file))
days_diff = (dnow-dmodify).days
if days_diff > daysold :
os.remove(file)
logger.info('%s %s %s deleted', file.ljust(columnw),
dmodify.strftime('%Y-%m-%d %H:%M:%S'), days_diff)
else :
logger.info('%s %s %s', file.ljust(columnw),
dmodify.strftime('%Y-%m-%d %H:%M:%S'), days_diff)
except OSError as e:
logger.error('OSError: {}. File: {}'.format(e.strerror, e.filename))

def main():
(rootdir, daysold, logfile, columnw) = parse_arguments()
logger = configure_logging(logfile)
delete_old_files(rootdir, daysold, columnw, logger)

if __name__ == '__main__':
main()
А ООП сюда я и не собирался пихать. Я говорил о том, что ООП для меня это лес дремучий. И что я хочу в нем разобраться.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version