Питон | создание файла и увеличение имени при каждом запуске

Хорошо, у меня есть программа, которая запускается, и каждый раз, когда она выполняет код, она записывает комментарий в файл журнала:

def logger(event):
event = str(event)
current_date = datetime.datetime.now()
current_time_for_log = current_date.strftime('%d-%m-%y %H:%M:%S --- ')
date_file_name = current_date.strftime('%d-%m-%y')
with open('{}'.format(date_file_name), 'a+') as log_file:
    log_file.write('-' * 50 + '\n' + '\n')
    log_file.write(current_time_for_log + event + '\n')

если файл существует, он будет записывать в файл, если нет, он создает файл и называет его текущей датой (например, 13.09-18)

теперь то, что я хочу выполнить, и просто не могу понять, как это сделать с помощью os.path.exist (), заключается в том, что каждый раз, когда я запускаю программу, она проверяет, есть ли файл с текущей датой, если не создает его, и если он существует создайте файл с той же датой, но добавьте к нему '_1':

первый раз запуска программы- создает файл 13-09-18

второй раз """- создает файл 13-09-18_1

третий раз """- создает файл 13-09-18_2

так далее...

что происходит, когда я использую os.path.exist (), в лучшем случае я получаю увеличивающиеся имена файлов, но он делает это каждый раз, когда функция вызывается, поэтому каждый комментарий получает файл с увеличивающимися именами вместо того, чтобы записывать все комментарии запуска в тот же файл ..

Пожалуйста, опубликуйте свою лучшую попытку кодирования. Stack Overflow гораздо эффективнее исправляет неправильный код, чем создание нового кода с нуля.

Prune 13.09.2018 20:06

Просто поместите код создания файла за пределы функции регистратора

Stack 13.09.2018 20:08

Я удалил его, и теперь я не могу повторить его снова ... в любом случае я попытаюсь повторить его ..

omerb 13.09.2018 20:10

def logger (событие): event = str (событие) current_date = datetime.datetime.now () current_time_for_log = current_date.strftime ('% d-% m-% y% H:% M:% S ---') имя_файла_даты = current_date.strftime ('% d-% m-% y') i = 0, в то время как os.path.exists (date_file_name): i + = 1 с открытым ('{} {} {}'. format (date_file_name, ' _ ', str (i)),' a + ') как log_file: log_file.write (' - '* 50 +' \ n '+' \ n ') log_file.write (current_time_for_log + event +' \ n ') равно лучшее, что я могу сделать .. он просто записывает новые имена файлов 13-09-18_0 и действует так же, как и обычный код, который я опубликовал ..

omerb 13.09.2018 20:23
1
4
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам понадобится вторая функция, и ее придется вызывать вне функции logger. Что-то вроде этого:

def getlogfile(prefix):
    file_list = [filename for filename in os.listdir('.') if filename.startswith(prefix)]
    if prefix not in file_list:
        # file doesn't exist yet; make it.
        target_name = prefix
    else:
        # get latest one
        number_list = [int(filename[-1]) for filename in file_list if filename[-2] == '_']
        try:
            latest_num = sorted(number_list)[-1]
            target_name = '{}_{}'.format(prefix, latest_num + 1)
        except IndexError:
            # there aren't any underscored names yet
            target_name = '{}_1'.format(prefix)
    return target_name


def logger(event, date_file_name):
    event = str(event)
    current_date = datetime.datetime.now()
    current_time_for_log = current_date.strftime('%d-%m-%y %H:%M:%S --- ')    
    with open('{}'.format(date_file_name), 'a+') as log_file:
        log_file.write('-' * 50 + '\n' + '\n')
        log_file.write(current_time_for_log + event + '\n')

date_file_name = getlogfile(datetime.date.today().strftime('%d-%m-%y'))

logger('first call, new file', date_file_name)
logger('second call, same file', date_file_name)

должен сделать трюк за вас.

отлично работает, но только когда я удаляю аргумент регистратора date_file_name, почему?

omerb 13.09.2018 22:24

если я не удаляю его, возвращается ошибка TypeError: logger () отсутствует 1 обязательный позиционный аргумент: 'date_file_name'

omerb 13.09.2018 22:25

Я не включил пример его вызова. Его следует вызывать с двумя аргументами, вторым из которых является имя префикса. Я отредактирую свой ответ, включив в него несколько примеров звонков.

Feneric 13.09.2018 22:27

он должен работать таким образом? я имею в виду прямо сейчас, когда я регистрирую что-то, например '/ code' def number (log): x = 1 log ('x is 1') number (logger) 'code'

omerb 13.09.2018 22:34

Всегда можно немного снизить качество кода и сделать date_file_name глобальным. Это в значительной степени то, что вы уже сделали, когда удалили второй аргумент и вызвали его с помощью одного. Вы также можете инкапсулировать регистратор в класс и сделать имя файла атрибутом данных.

Feneric 13.09.2018 22:49

Другие вопросы по теме