将嵌套的大括号转换为 Python 字典

3

我有一个像这样的文件:

{val1 {val2 {d1 d2 d3}}}

我希望创建一个字典或其他适当的数据结构,以便像这样访问该结构:
data[val1][val2]

将数据值d1,d2,d3输出到另一个合适的数据结构(例如列表、元组或集合)中。

是否有内置库函数可以实现此操作或者有人可以建议一种简单的方法来实现此操作?

注意:数据点d1,d2,d3的数量可能不是固定的,因此对于不同的值集,我可能会有d1,d2,d3,d4,d5等。

编辑:我应该补充说明一下,我编写了输出,因此如果需要,我可以将大括号更改为完全不同的内容。


4
这种格式并不常见,所以没有内置函数可以处理它。需要编写代码对其进行分词、解析,并输出字典。 - Martijn Pieters
这是一个快速的方法来帮助将其转换为字典格式 replace('{', ':{')[1:] - Tim
这并不容易。你的值被包含在 { } 中,但你想要它们变成 [ ] - Tim
2
根据您拥有的这些文件数量,将文件先转换为YAML(或JSON)格式,然后再使用相关库可能会更容易。 - cdarke
1
@user1654183:你说的“我写了输出”是什么意思?你选择了格式吗?最好使用标准格式,比如json。 - Håken Lid
显示剩余2条评论
2个回答

6
如果你的所有数据跟这个例子一样简单,你可以做一些字符串操作来将它转换为json格式。
import re, json
data = '{val1 {val2 {d1 d2 d3}}}'
data = re.sub(r'(\w+)', r'"\1"', data)      # {"val1" {"val2" {"d1" "d2" "d3"}}}
data = re.sub(r'"\s*{', r'": {', data)      # {"val1": {"val2": {"d1" "d2" "d3"}}}
data = re.sub(r'" "', r'", "', data)        # {"val1": {"val2": {"d1", "d2", "d3"}}}
data = re.sub(r'{([^{}]*)}', r'[\1]', data) # {"val1": {"val2": ["d1", "d2", "d3"]}}
json.loads(data)

如果您的数据包含更复杂的嵌套,那么在使其成为有效的JSON之前,您可能需要添加一两个步骤来添加或删除逗号。


0

我不知道你会用这些数据做什么,但根据你提供的信息,这似乎很有用。至少它可以给你一个想法,你可以随意操作转换器。

______exampledata.txt

{a{a{hello world}}}
{a{b{stack over flow}}}
{b{a{example data 1}}}
{b{b{data example 2}}}

______converter.py

import os

fo = open("exampledata.txt", "r")
data = fo.read()
fo.close()

data = data.split("\n")

fo = open("converteddata.txt", "w")
for line in data:
    line = line.split("{")
    if len(line) < 2:
        break
    fo.write("data['")
    fo.write(line[1]+"-"+line[2]+"'] = [")
    splitData = line[3].split("}}}")[0]
    splitData = splitData.split(" ")
    for d in splitData:
        fo.write("'"+d+"', ")
    fo.seek(-2, os.SEEK_END)
    fo.truncate()
    fo.write("]\n")

______converteddata.txt(转换器将生成此文件)

data['a-a'] = ['hello', 'world']
data['a-b'] = ['stack', 'over', 'flow']
data['b-a'] = ['example', 'data', '1']
data['b-b'] = ['data', 'example', '2']

转换后数据的使用方法

data = dict()

data["a-a"] = ["hello", "world"]
data["a-b"] = ["stack", "over", "flow"]
data["b-a"] = ["example", "data", "1"]
data["b-b"] = ["data", "example", "2"]

val1 = raw_input("Please enter first parameter : ")
val2 = raw_input("Please enter second parameter : ")
index = raw_input("Please enter index : ")

print data[val1+"-"+val2][int(index)]

编辑:您不会将转换后的数据复制/粘贴到主项目中。如果您有大量数据,那么您的主项目文件看起来会非常糟糕。因此,您可以创建一个名为converteddata.py的文件。

data = dict()

data['a-a'] = ['hello', 'world']
data['a-b'] = ['stack', 'over', 'flow']
data['b-a'] = ['example', 'data', '1']
data['b-b'] = ['data', 'example', '2']

然后你可以像这样将它导入到你的主项目中

from converteddata import data

print data["a-a"][0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接