Python将文本文件解析为嵌套字典

时间:2017-10-21 17:59:03

标签: python parsing dictionary

考虑以下数据结构:

[HEADER1]
{
   key value
   key value
   ...
   [HEADER2]
   {
      key value
      ...
   }
   key value
   [HEADER3]
   {
      key value
      [HEADER4]
      {
         key value
         ...
      }
   }
   key value
}

原始数据中没有缩进,但为了清楚起见,我在这里添加了缩进。键值对的数量未知,“......”表示可能还有更多 在每个[HEADER]块内。 [HEADER]块的数量也是未知的。

请注意,该结构是嵌套的,因此在此示例中,标题2和3位于标题1内,标题4位于标题3内。

可以有更多(嵌套)标题,但我保持示例简短。

如何将其解析为嵌套字典结构?每个[HEADER]应该是大括号内的任何内容的关键。

最终结果应该是:

dict = {'HEADER1': 'contents of 1'}
contents of 1 = {'key': 'value', 'key': 'value', 'HEADER2': 'contents of 2', etc}

我猜我需要某种递归函数,但我对Python很陌生,不知道从哪里开始。

对于初学者,我可以按如下方式拉出所有[HEADER]键:

path = 'mydatafile.txt'
keys = []

with open (path, 'rt') as file:
   for line in file:
      if line.startswith('['):
         keys.append(line.rstrip('\n'))

for key in keys:
   print(key)

然后呢,也许这甚至不需要?

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您可以使用少量正则表达式预格式化文件内容,然后将其传递给json.loads

你可以逐一进行这类正则表达式替换:

#1 \[(\w*)\]\n - > "$1":

#2 \}\n(\w) - > },$1

#3 (\w*)\s(\w*)\n([^}]) - > $1:$2,$3

#4 (\w*)\s(\w*)\n\} - > $1:$2}

然后最后将最后一个字符串传递给json.loads

import json
d = json.loads(s)

将解析为dict格式。

说明:

1。 \[(\w*)\]\n:将[HEADERS]\n替换为"HEADERS":

2。 \}\n(\w):使用}

替换任何具有任何值的结束括号,},

3。 (\w*)\s(\w*)\n([^}]):将key value\n替换为key:value,,以获取包含任何下一个元素的行

4. (\w*)\s(\w*)\n\}:对于没有下一个元素的行,将key value\n替换为key:value

因此,通过对这些正则表达式的微小修改,您将能够将其解析为dict格式,基本概念是将文件内容重新格式化为可以轻松解析的格式。

答案 1 :(得分:-1)

我会转换 [头1] 至 "标题":" HEADER1"

关键值 至 " key":"值"

用{}附上所有内容 最后用json库解析它 你可以用sed转换它

相关问题