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

如何将表示嵌套结构的文本文件转换为Python嵌套字典?

问题:将缩进层级文本转换为Python嵌套字典

原始文本示例

order product product_X
 enabled     true
 description smartphone
 specific routing Y
  service service A
  instance Yes
 routing ip 0.0.0.0
  address ipv4 0.0.0.0
  address-family 0.0.0.0
  neighbor x.x.x.x
   advertise              true
   remote-as              0
  neighbor y.y.y.y
   peer-type              external
   address-family         0.0.0.0
 ip                       0.0.0.0/0

order product product_Y
 enabled     true
 description smartphone

转换规则

  • 嵌套层级由左侧空格数确定
  • 当前行左侧空格数多于上一行时,上一行为父层级
  • 左侧空格数为0的键表示新的表结构
  • 值为字符串最右侧空格分隔的部分
  • 同一嵌套层级下重复出现的键,其嵌套结构需存储为列表
  • 若键下方存在嵌套结构,其值需存储在下一层级的name字段中
  • 无法预先知晓各表中的字段名称

目标Python嵌套字典输出

{
 'order product': [
                   {
                   'name': 'product_X',
                   'enabled': 'true',
                   'description': 'smartphone',
                   'specific routing': {
                                         'name': 'Y', 
                                         'service': 'A', 
                                         'instance': 'Yes'
                                       },
                   'routing ip': {'name': '0.0.0.0',
                                 'address ipv4': '0.0.0.0',
                                 'neighbor': [
                                              {'name': 'x.x.x.x', 'advertise': 'true', 'remote-as': 0},
                                              {'name': 'y.y.y.y','peer-type': 'external','address-family': '0.0.0.0'}
                                              ]
                                 },
                  'ip': '0.0.0.0/0'},
                     {
                   'name': 'product_Y',
                   'enabled': 'True',
                   'description': 'smartphone'
                     }
                     ]
  }

解决思路提示

  1. 预处理每行数据:遍历所有行,记录每行的缩进空格数、键(除最后一个元素外的空格分隔内容)、值(最后一个空格分隔元素),跳过空行。
  2. 维护层级栈:用栈跟踪当前嵌套层级,栈元素包含当前层级的字典和对应缩进数。初始栈为空,遇到缩进0的行时创建对应字典并加入栈;后续行根据缩进数与栈顶元素比较:
    • 缩进更大:作为栈顶字典的子节点,创建新字典,若父字典已有该键,非列表则转为列表后追加新字典,再将新字典压入栈。
    • 缩进相等:弹出栈顶,将当前行处理后加入上一层对应位置。
    • 缩进更小:连续弹出栈顶直到找到缩进数小于等于当前行的层级,再处理当前行。
  3. 处理重复键:给字典赋值前检查键是否存在:不存在则直接赋值;存在则若当前值是单个字典就转为列表,再追加新内容,已为列表则直接追加。
  4. name字段判断:若某行后续有子节点(下一行缩进更大),则该行的值存入新字典的name字段,当前键对应这个新字典;若无后续子节点,当前键直接对应值。
  5. 顶层结构处理:缩进0的行作为顶层键,对应值为列表,每次遇到缩进0的行就创建新字典并追加到对应列表中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:21:01