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

如何将RECORD格式SQL输出文件读取为Pandas DataFrame

最优实现方案

这种输出格式是PostgreSQL psql客户端开启扩展输出(\x模式)后的竖排结果格式,两种实现路径按需选择,优先选第一种无解析成本的方案:

方案1:从导出环节规避(优先推荐,零解析成本)

如果还能控制SQL导出流程,根本不需要写解析代码:

  • 导出前在psql中执行\x off关闭竖排扩展输出模式,再通过\copy命令导出标准CSV文件,直接用pandas.read_csv()读取即可
  • 也可以执行\pset format csv将psql默认输出格式设置为CSV,再将查询结果重定向到文件,导出的文件可以直接被Pandas读取

方案2:解析已生成的该格式文件

如果已经拿到了这种格式的导出文件,用纯Python写简单的解析逻辑即可,不需要安装额外依赖,处理十万到百万行级的文件性能完全够用。
解析逻辑:

  • 逐行读取文件,匹配到-[ RECORD 开头的行时,代表开始一条新的记录
  • 普通内容行按第一个|切分,得到字段名和字段值,去除两侧多余空白后存入当前记录
  • 所有记录解析完成后直接传入Pandas生成DataFrame即可
    可直接复用的代码:
import pandas as pd
from typing import List, Dict

def parse_psql_expand_file(file_path: str, file_encoding: str = 'utf-8') -> pd.DataFrame:
    records: List[Dict] = []
    current_row: Dict = {}
    with open(file_path, 'r', encoding=file_encoding) as f:
        for raw_line in f:
            line = raw_line.rstrip('\r\n')
            # 识别新记录起始行
            if line.startswith('-[ RECORD '):
                if current_row:
                    records.append(current_row)
                current_row = {}
                continue
            # 跳过空行
            if not line.strip():
                continue
            # 仅按第一个|切分,避免字段值本身包含|导致解析错误
            col, val = line.split('|', 1)
            current_row[col.strip()] = val.strip()
        # 追加最后一条未存入的记录
        if current_row:
            records.append(current_row)
    return pd.DataFrame(records)

# 调用示例
df = parse_psql_expand_file('your_result_file.txt')

解析注意事项

  • 切分行内容时必须加maxsplit=1参数(也就是上面写的split('|', 1)),否则如果字段值里本身包含|字符,会出现列错位的问题
  • 如果是Windows环境下导出的文件,编码可能是GBK,调用函数时把file_encoding参数改成gbk即可
  • 解析得到的所有列默认是字符串类型,后续可以根据业务需要用pd.to_numeric、pd.to_datetime等方法转成对应的数据类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:33:28