【问题标题】:python | making a file and incrementing the name every run蟒蛇 |制作一个文件并在每次运行时增加名称
【发布时间】:2018-09-13 18:01:50
【问题描述】:

好吧,我有一个正在运行的程序,每次它执行代码时都会向日志文件写入注释:

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() 时会发生什么,充其量我会得到一个递增的文件名,但每次调用函数时都会这样做,所以每个注释都会得到一个名称递增的文件,而不是写入所有 cmets运行到同一个文件..

【问题讨论】:

  • 请发布您的最佳编码尝试。 Stack Overflow 在修复错误代码方面比从头开始提供新代码更有效。
  • 把文件创建代码放到logger函数外面就行了
  • 我删除了它,现在我真的不能再复制它了...无论如何我会尝试复制它..
  • 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') i = 0 while os.path.exists(date_file_name): i +=1 with open('{}{}{ }'.format(date_file_name, '_', str(i)), 'a+') as log_file: log_file.write('-' * 50 + '\n' + '\n') log_file.write(current_time_for_log + event + '\n') 是我能做的最好的了.. 它只是写了一个新的文件名 13-09-18_0 并且与我发布的普通代码相同..

标签: python file logging filenames


【解决方案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 时,为什么?
  • 如果我不删除它会返回错误 TypeError: logger() missing 1 required positional argument: 'date_file_name'
  • 我没有包括它被调用的例子。应该使用两个参数调用它,第二个是前缀名称。我将编辑我的答案以包含一些示例调用。
  • 必须这样运行吗?我的意思是现在当我记录一些东西时,例如'/code' def number(log): x = 1 log('x is 1') number(logger) 'code'
  • 您总是可以稍微降低代码质量并将date_file_name 设为全局。当您删除第二个参数并用一个调用它时,这几乎就是您所做的。您还可以将记录器封装在一个类中,并使文件名成为数据属性。
猜你喜欢
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2021-12-08
  • 2019-09-20
  • 1970-01-01
  • 2021-03-04
  • 2021-10-31
相关资源
最近更新 更多