如何将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
相关产品推荐
相关产品推荐

