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

如何利用Pandas高效将带分段的dat文件转换为DataFrame?

优化多段汽车报告dat文件的Pandas处理方案

针对你用逐行正则循环处理效率低的问题,可以结合Pandas批量读取表格和段落拆分预处理的方式替代循环,大幅提升处理速度,同时适配多文件场景。

核心思路

  1. 先将整个文件按段落拆分(根据实际的段落分隔规则,比如空行或特定元数据开头)
  2. 对每个段落,分离头部元数据和表格数据
  3. 用Pandas的read_csv批量读取表格部分(避免逐行解析)
  4. 将元数据作为列追加到对应表格的DataFrame
  5. 合并所有段落/文件的结果

单文件处理示例

假设你的dat文件结构如下(段落间以空行分隔):

Car: Toyota
Country: Japan
PPM Price Age
120 25000 3
135 28000 2

Car: Ford
Country: USA
PPM Price Age
110 22000 4
140 30000 1

对应的处理代码:

import pandas as pd
import re

# 预编译正则(提升重复匹配效率)
metadata_pattern = re.compile(r'(Car|Country):\s*(.*)')

with open('car_reports.dat', 'r') as f:
    content = f.read()

# 按空行拆分段落(根据实际结构调整分隔规则)
paragraphs = [p.strip() for p in content.split('\n\n') if p.strip()]

final_dfs = []
for para in paragraphs:
    lines = para.split('\n')
    metadata = {}
    table_lines = []
    
    # 分离元数据和表格行
    for line in lines:
        match = metadata_pattern.match(line)
        if match:
            key, val = match.groups()
            metadata[key] = val
        else:
            table_lines.append(line)
    
    # 用Pandas批量读取表格(StringIO模拟文件对象)
    table_df = pd.read_csv(
        pd.io.common.StringIO('\n'.join(table_lines)),
        sep='\s+'  # 假设表格是空格分隔,根据实际调整
    )
    
    # 追加元数据列
    for key, val in metadata.items():
        table_df[key] = val
    
    final_dfs.append(table_df)

# 合并所有段落的结果
result_df = pd.concat(final_dfs, ignore_index=True)

多文件场景适配

将上述逻辑封装为函数,结合glob遍历所有dat文件,批量处理后合并:

import glob

def process_car_report(file_path):
    with open(file_path, 'r') as f:
        content = f.read()
    paragraphs = [p.strip() for p in content.split('\n\n') if p.strip()]
    
    file_dfs = []
    for para in paragraphs:
        lines = para.split('\n')
        metadata = {}
        table_lines = []
        
        for line in lines:
            match = metadata_pattern.match(line)
            if match:
                key, val = match.groups()
                metadata[key] = val
            else:
                table_lines.append(line)
        
        table_df = pd.read_csv(
            pd.io.common.StringIO('\n'.join(table_lines)),
            sep='\s+'
        )
        
        for key, val in metadata.items():
            table_df[key] = val
        
        file_dfs.append(table_df)
    
    return pd.concat(file_dfs, ignore_index=True)

# 处理所有dat文件
all_files = glob.glob('*.dat')
all_results = [process_car_report(f) for f in all_files]
final_full_df = pd.concat(all_results, ignore_index=True)

关键优化点

  • 避免逐行解析表格:用read_csv批量读取表格,比手动循环拆分字符串效率高得多
  • 预编译正则:将元数据匹配的正则提前编译,减少重复编译的开销
  • 矢量操作追加元数据:直接给DataFrame新增列,比逐行添加元数据快
  • 灵活适配段落规则:如果段落不是空行分隔(比如以Car:开头),可以用正则拆分:
    paragraphs = re.split(r'^(?=Car:)', content, flags=re.MULTILINE)
    paragraphs = [p.strip() for p in paragraphs if p.strip()]
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:42:47