如何将列宽不规则的文本文件解析为Pandas DataFrame?
解决方案
可以用正则表达式匹配来提取每一列的内容,日志行有固定结构模式,具体步骤如下:
- 将日志内容转为字符串列表(如果从文件读取,可直接用
pd.read_csv读取为Series) - 用
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
相关产品推荐
相关产品推荐

