You need to enable JavaScript to run this app. Python使用pandas解析日志时如何跳过无法解析的非日期字符串
优惠活动
大模型
产品
解决方案
定价
更多

Python使用pandas解析日志时如何跳过无法解析的非日期字符串

问题诊断
  • 你当前的try-except作用于整列的apply操作,只要某一行日期解析抛出异常,整个LogDate列的赋值就会直接终止,但这不是输出错乱的核心原因。
  • 核心问题出在逐行读取逻辑:你没有区分正常日志行和异常栈附属行,Java抛出的异常栈是上一条正常日志的附属内容,不属于独立日志行,但你将这些行也按正常日志的规则拆分,自然得到了完全错误的LogStatus、LogInfo字段。比如异常行java.net.SocketTimeoutException: Read timed out按你的拆分逻辑,line.split(maxsplit=6)得到的line[-1]是最后一个单词out,拆分后LogStatus和LogInfo都为out,和你错误输出的内容完全吻合。
修复方案

首先在读取阶段合并异常栈到所属的正常日志,再对单条日期做安全解析,异常处理放在单条转换逻辑中,不要包裹整列操作:

import pandas as pd
import dateutil.parser

# 单条日期安全解析函数
def safe_parse_date(date_str):
    try:
        return dateutil.parser.parse(date_str, ignoretz=True)
    except:
        # 解析失败返回空值,也可以按需返回原始字符串
        return None

data = []
current_log = None

with open(inputFile, "r") as f_in:
    for line in map(str.strip, f_in):
        if not line:
            continue
        # 正常日志行以月份开头,异常栈行以java.、at、Caused by等开头
        if line.split()[0] in {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}:
            # 新的正常日志开始,先存储上一条日志
            if current_log is not None:
                data.append(current_log)
            # 拆分正常日志字段
            parts = line.split(maxsplit=6)
            current_log = {
                "LogDate": " ".join(parts[:6]),
                "LogStatus": parts[-1].split(maxsplit=1)[0],
                "LogInfo": parts[-1].split(maxsplit=1)[-1]
            }
        else:
            # 异常栈内容追加到当前日志的信息字段
            if current_log is not None:
                current_log["LogInfo"] += "\n" + line
# 存储最后一条日志
if current_log is not None:
    data.append(current_log)

df = pd.DataFrame(data)
# 安全转换日期
df["LogDate"] = df["LogDate"].apply(safe_parse_date)

# 输出CSV,换行符会自动转义,不会乱行
df.to_csv("output.csv", index=False, encoding="utf-8")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 03:24:00