在4690系统中使用Python重命名日志文件失败的技术求助
解决方案:4690系统下RotatingFileHandler日志轮转失败问题
核心问题定位
从报错信息FileNotFoundError: [Errno 2] No such file or directory: 'F:/logs/hwinfo/HWINFO.L\nOG' -> 'F:/logs/hwinfo/HWINFO.LOG.1'可以明确:LOGFILE变量中存在隐藏的换行符\n,导致系统无法识别正确的文件名。4690作为DOS与Linux的混合系统,对字符串中的特殊字符敏感度远高于Mac,这是引发问题的关键。
具体解决步骤
1. 清理文件名变量的隐藏字符
在定义或使用LOGFILE前,强制去除字符串中的换行、回车等空白字符:
# 定义路径后立即清理 LOGFILE = 'F:/logs/hwinfo/HWINFO.LOG' # 去除所有空白字符(包括换行、回车、空格) LOGFILE = LOGFILE.strip() # 或者精准去除换行/回车 LOGFILE = LOGFILE.replace('\n', '').replace('\r', '') # 可选:打印原始格式确认是否还有隐藏字符 print(repr(LOGFILE)) # 若输出包含\n则说明仍有残留
2. 适配4690系统的路径格式
4690对路径分隔符的兼容性特殊,建议使用系统原生路径处理函数标准化路径:
import os # 自动适配系统的路径分隔符和格式 LOGFILE = os.path.normpath(LOGFILE) # 或直接使用DOS风格的原始字符串路径 LOGFILE = r'F:\logs\hwinfo\HWINFO.LOG' # r前缀避免转义符干扰
3. 自定义RotatingFileHandler的轮转逻辑
如果系统自带的os.rename存在兼容性问题,替换默认的轮转方法:
from logging.handlers import RotatingFileHandler import os class CustomRotatingHandler(RotatingFileHandler): def doRollover(self): if self.stream: self.stream.close() self.stream = None # 清理路径中的特殊字符 base_path = self.baseFilename.replace('\n', '').replace('\r', '') target_path = f"{base_path}.1" # 先删除已存在的旧轮转文件 if os.path.exists(target_path): os.remove(target_path) # 用标准化路径执行重命名 os.rename(os.path.normpath(base_path), os.path.normpath(target_path)) self.stream = self._open()
使用时直接替换原有的RotatingFileHandler即可。
4. 增加文件存在性校验
在操作前先确认文件状态,便于排查问题:
if os.path.exists(LOGFILE): print(f"文件已找到: {LOGFILE}") os.rename(LOGFILE, f"{LOGFILE}.1") else: print(f"文件不存在,当前工作目录: {os.getcwd()}") print(f"目标目录内容: {os.listdir(os.path.dirname(LOGFILE))}")
额外注意事项
- 4690系统可能遵循DOS的8.3文件名规则,避免使用过长的文件名或后缀,可将
.LOG.1改为.HW1这类短后缀测试。 - 确保Python进程拥有目标文件的读写权限,4690的权限机制与Linux/Mac存在差异,必要时联系系统管理员确认权限配置。
内容的提问来源于stack exchange,提问作者Tahisha Tucker
相关产品推荐
相关产品推荐

