如何将表示嵌套结构的文本文件转换为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' } ] }
解决思路提示
- 预处理每行数据:遍历所有行,记录每行的缩进空格数、键(除最后一个元素外的空格分隔内容)、值(最后一个空格分隔元素),跳过空行。
- 维护层级栈:用栈跟踪当前嵌套层级,栈元素包含当前层级的字典和对应缩进数。初始栈为空,遇到缩进0的行时创建对应字典并加入栈;后续行根据缩进数与栈顶元素比较:
- 缩进更大:作为栈顶字典的子节点,创建新字典,若父字典已有该键,非列表则转为列表后追加新字典,再将新字典压入栈。
- 缩进相等:弹出栈顶,将当前行处理后加入上一层对应位置。
- 缩进更小:连续弹出栈顶直到找到缩进数小于等于当前行的层级,再处理当前行。
- 处理重复键:给字典赋值前检查键是否存在:不存在则直接赋值;存在则若当前值是单个字典就转为列表,再追加新内容,已为列表则直接追加。
name字段判断:若某行后续有子节点(下一行缩进更大),则该行的值存入新字典的name字段,当前键对应这个新字典;若无后续子节点,当前键直接对应值。- 顶层结构处理:缩进0的行作为顶层键,对应值为列表,每次遇到缩进0的行就创建新字典并追加到对应列表中。
内容的提问来源于stack exchange,提问作者Kspr
相关产品推荐
相关产品推荐

