如何利用Pandas高效将带分段的dat文件转换为DataFrame?
优化多段汽车报告dat文件的Pandas处理方案
针对你用逐行正则循环处理效率低的问题,可以结合Pandas批量读取表格和段落拆分预处理的方式替代循环,大幅提升处理速度,同时适配多文件场景。
核心思路
- 先将整个文件按段落拆分(根据实际的段落分隔规则,比如空行或特定元数据开头)
- 对每个段落,分离头部元数据和表格数据
- 用Pandas的
read_csv批量读取表格部分(避免逐行解析) - 将元数据作为列追加到对应表格的DataFrame
- 合并所有段落/文件的结果
单文件处理示例
假设你的dat文件结构如下(段落间以空行分隔):
Car: Toyota
Country: Japan
PPM Price Age
120 25000 3
135 28000 2Car: 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
相关产品推荐
相关产品推荐

