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

如何将列宽不规则的文本文件解析为Pandas DataFrame?

解决方案

可以用正则表达式匹配来提取每一列的内容,日志行有固定结构模式,具体步骤如下:

  1. 将日志内容转为字符串列表(如果从文件读取,可直接用pd.read_csv读取为Series)
  2. 用str.extract结合正则表达式,一次性提取出四列数据

完整代码示例

import pandas as pd

# 日志内容
log_text = """(11/15/22 2:48:46 PM EST) 14:48:33.671 - 42300146: GWS: 2022-11-15 18:18:33.638 RESTQueue No request to signal.
(11/15/22 11:55:59 AM EST) 11:40:22.750 - 31009225: GWS: 2022-11-15 15:10:22.748  Message Type Received: Slots
(11/8/22 8:03:39 AM EST) 07:32:38.188 - 28624922: Timed out waiting for incoming connections, retry after couple of secs"""

# 转为Series
logs = pd.Series(log_text.split('\n'))

# 正则匹配提取列
pattern = r'^(\(.*?\))\s+(\d{2}:\d{2}:\d{2}\.\d{3})\s+-\s+(\d+):\s+(.*)$'
df = logs.str.extract(pattern)

# 设置列名
df.columns = ['Column 1', 'Column 2', 'Column 3', 'Column 4']

print(df)

代码说明

  • 正则表达式^(\(.*?\))\s+(\d{2}:\d{2}:\d{2}\.\d{3})\s+-\s+(\d+):\s+(.*)$的含义:
    • (\(.*?\)):匹配第一列带括号的时间字符串(非贪婪匹配,确保只取到第一个右括号)
    • (\d{2}:\d{2}:\d{2}\.\d{3}):匹配第二列的时分秒+毫秒格式时间
    • (\d+):匹配第三列的数字ID
    • (.*):匹配剩余所有内容作为第四列
  • str.extract会自动将匹配到的分组转为DataFrame的列

运行结果

Column 1       Column 2   Column 3                                                                 Column 4
0  (11/15/22 2:48:46 PM EST)  14:48:33.671  42300146  GWS: 2022-11-15 18:18:33.638 RESTQueue No request to signal.
1 (11/15/22 11:55:59 AM EST)  11:40:22.750  31009225       GWS: 2022-11-15 15:10:22.748  Message Type Received: Slots
2    (11/8/22 8:03:39 AM EST)  07:32:38.188  28624922        Timed out waiting for incoming connections, retry after couple of secs

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:15:41