如何用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
相关产品推荐
相关产品推荐

