
本文详解如何将格式化的 sql 查询输出字符串(含表头与多行数据)解析为结构化的字典列表,支持 python 2 和 python 3,核心步骤包括按行切分、提取表头、逐行拆分字段并映射为键值对。
本文详解如何将格式化的 sql 查询输出字符串(含表头与多行数据)解析为结构化的字典列表,支持 python 2 和 python 3,核心步骤包括按行切分、提取表头、逐行拆分字段并映射为键值对。
在实际开发中,尤其是与遗留系统或轻量级数据库交互时,我们常会收到以纯文本形式返回的 SQL 查询结果(如 psql -t 或某些 CLI 工具输出),其格式类似表格:首行为字段名,第二行为分隔线(如 =============),后续为数据行。这类字符串虽非标准 JSON 或 CSV,但可通过文本解析高效转为结构化数据——即 Python 中的字典列表(即“对象数组”)。
以下是一个典型输入示例:
text = 'enable id \n =============\nf avc-qwqwq\nt abd-rrtrtr\n f rec-yyuyu \n'
目标是将其转换为:
[
{'enable': 'f', 'id': 'avc-qwqwq'},
{'enable': 't', 'id': 'abd-rrtrtr'},
{'enable': 'f', 'id': 'rec-yyuyu'}
]✅ 推荐方案(Python 3 原生简洁写法)
利用 str.splitlines() 安全处理跨平台换行符,并结合解包语法提取表头与数据行:
text = 'enable id \n =============\nf avc-qwqwq\nt abd-rrtrtr\n f rec-yyuyu \n' # 拆分为行列表,跳过分隔线(第2行) header_str, _, *rows_str = text.splitlines() # 解析表头:按空白字符分割,自动过滤空字符串 header = header_str.split() # 对每行数据执行:split() → 与 header zip → 转为 dict objs = [dict(zip(header, row_str.split())) for row_str in rows_str if row_str.strip()] print(objs)
✅ 优势:代码简短、可读性强;split() 默认忽略首尾空白及连续空格,天然适配不规则缩进(如 ' f rec-yyuyu ');if row_str.strip() 过滤空行,增强鲁棒性。
⚙️ 兼容 Python 2 的等效实现
Python 2 不支持 *args 解包语法(PEP 3132),需改用迭代器显式取值:
text = 'enable id \n =============\nf avc-qwqwq\nt abd-rrtrtr\n f rec-yyuyu \n' lines = text.splitlines() iter_lines = iter(lines) # 安全提取:header(第1行)、跳过分隔线(第2行)、收集剩余行 header_str = next(iter_lines) _ = next(iter_lines) # 忽略分隔线 rows_str = list(iter_lines) header = header_str.split() objs = [dict(zip(header, row_str.split())) for row_str in rows_str if row_str.strip()] print(objs)
⚠️ 关键注意事项
- 字段分隔假设:上述方案默认列间以任意空白符(空格/制表符)分隔。若实际数据含空格(如组织名 "New York Tech"),则 split() 会错误切分。此时应改用固定宽度解析或正则提取(例如 re.findall(r'(\S+)\s+(\S.*)', row))。
- 表头一致性:确保首行字段名无重复且与数据列数严格匹配,否则 zip 会截断或填充 None。
- 编码与空白处理:splitlines() 自动处理 \n, \r\n, \r;split() 自动清理前后空格及多余空白,无需额外 strip()。
- 空行与注释行:建议始终添加 if row_str.strip() 过滤,避免因末尾换行或空行导致空字典。
? 总结
将 SQL 文本结果转为对象数组,本质是结构化文本解析问题。核心逻辑三步走:
- 分层切分:用 splitlines() 拆出逻辑行;
- 元数据提取:从首行提取 header,跳过分隔行;
- 映射构造:对每行 split() 得字段值,zip(header, values) 构建键值对,再 dict() 实例化。
该方法轻量、无外部依赖、兼容双版本 Python,是处理类表格文本的通用范式。如需扩展支持 CSV 式引号包裹或类型转换(如 'enable' → bool),可在 row_str.split() 后插入自定义清洗函数。










