You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python每次运行脚本时生成新的日志文件?

实现每次运行脚本生成新日志文件的Python方案

你的原代码存在两个核心问题:

  • 始终以追加模式写入同一个log_file.txt,不会生成新文件
  • 局部变量counter每次调用都会重置,无法追踪已存在的日志文件编号

下面给出两种可行的解决方案,满足“每次运行脚本生成一个新日志文件”的需求:

方案一:按顺序查找第一个可用编号

此方案会依次检查log_file.txt、log_file1.txt、log_file2.txt…,返回第一个不存在的文件名。

import os
from datetime import datetime

def get_next_log_filename():
    base_name = "log_file"
    extension = ".txt"
    # 先检查基础日志文件是否存在
    if not os.path.exists(f"{base_name}{extension}"):
        return f"{base_name}{extension}"
    # 依次查找带编号的日志文件
    counter = 1
    while True:
        current_filename = f"{base_name}{counter}{extension}"
        if not os.path.exists(current_filename):
            return current_filename
        counter += 1

# 脚本启动时就确定本次运行的日志文件
LOG_FILENAME = get_next_log_filename()

def log(message):
    try:
        log_message = f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {message}\n"
        # 用追加模式写入,同一个脚本运行期间多次调用log会持续写入当前日志文件
        with open(LOG_FILENAME, "a", encoding="utf-8") as log_file:
            log_file.write(log_message)
    except Exception as e:
        print(f"日志写入出错: {e}")

# 测试示例
if __name__ == "__main__":
    log("脚本启动成功")
    log("执行了数据处理操作")

方案二:基于最大编号递增

此方案会收集所有已存在的日志文件编号,取最大值加1生成新文件名(即使中间有编号缺失,也会按最大编号继续递增)。

import os
from datetime import datetime

def get_next_log_filename():
    base_name = "log_file"
    extension = ".txt"
    existing_numbers = []
    # 遍历目录下所有文件,提取日志文件的编号
    for filename in os.listdir():
        if filename.startswith(base_name) and filename.endswith(extension):
            if filename == f"{base_name}{extension}":
                # 基础文件对应编号0
                existing_numbers.append(0)
            else:
                # 提取文件名中的数字部分
                num_part = filename[len(base_name):-len(extension)]
                if num_part.isdigit():
                    existing_numbers.append(int(num_part))
    # 没有日志文件时返回基础文件名
    if not existing_numbers:
        return f"{base_name}{extension}"
    # 取最大编号加1生成新文件名
    max_num = max(existing_numbers)
    return f"{base_name}{max_num + 1}{extension}" if max_num !=0 else f"{base_name}1{extension}"

LOG_FILENAME = get_next_log_filename()

def log(message):
    try:
        log_message = f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {message}\n"
        with open(LOG_FILENAME, "a", encoding="utf-8") as log_file:
            log_file.write(log_message)
    except Exception as e:
        print(f"日志写入出错: {e}")

# 测试示例
if __name__ == "__main__":
    log("脚本启动")
    log("完成配置加载")

关键说明

  • 脚本启动时就确定本次运行的日志文件名,确保同一脚本运行期间所有日志都写入该新文件
  • 使用encoding="utf-8"避免中文等特殊字符的编码问题
  • 两种方案可根据实际需求选择:方案一填补缺失的编号,方案二保持编号连续递增

内容的提问来源于stack exchange,提问作者vineesha shyamala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:17:36