我想在 python 中将 txt 制作成字典

I want to make a txt into a dict in python

所以我有以下数据:

Apples = 1
Bananas = 1
Box_Cashew = 
{ 
    Cashew = 1
}
Dragonsfruit = 2
Crate_box_epox=
{
    box_epox = 
        {
             epox = 2
        }
}

并想从这个 txt 制作一个字典,如下所示:

{'Apple':'1' , 'Bananas' : '1' , 'Box_Cashew' : {'Cashew':'1'} , 'Dragonsfruit' : '2', 'Crate_box_epox' : { 'box_epox' : {'epox':2}}}

我试着用下面的代码逐行阅读,但是当我在一个字典中得到一个字典时,我不知道该怎么办。

编辑:

@PrestonM 和@juanpa.arrivillaga

文本文件:

unit=9023
state=1411
flags=
{
    1NobelChemistry=yes
    1NobelLiterature=yes
    1NobelMedicine=yes
}
worldmarket=
{
    worldmarket_pool=
    {
        ammunition=204.50766
    }
}

代码:

text_file = open("teste.v2", "r")
lines = text_file.readlines()
d={}
for line in lines:
        try:
            (key1, val) = line.replace('\t','').replace('\n','').split('=')

            d[str(key1)] = val
        except:
            pass       

结果:

>>>d
{'unit':'9023' , 'state':'1411' , 'flags':{},'1NobelChemistry':'yes' , '1NobelLiterature':'yes' , '1NobelMedicine':'yes','worldmarket':{},'worldmarket_pool':{},'ammunition':'204.50766'}

想要的结果:

>>>d
{'unit':'9023' , 'state':'1411' , 'flags':{ '1NobelChemistry':'yes' , '1NobelLiterature':'yes' , '1NobelMedicine':'yes'},'worldmarket':{'worldmarket_pool':{'ammunition':'204.50766'}}}

以下似乎在我的测试中有效。我希望例外中的评论和文字能够清楚地说明正在做什么。

在您的代码中,您只是将所有内容添加到同一个字典中,这无法产生您想要的结果。一旦遇到 {,您想开始将 key/value 对添加到新词典中,该词典实际上存储在旧词典中。为实现这一点,下面的代码在列表中跟踪这些词典,必要时添加一个,并从列表中删除一个以返回到上一个词典。

dictStack = [ { } ]
currentKey = None
for l in lines:
    l = l.strip() # Remove whitespace at start/end
    if not l: # skip empty line
        continue

    if l == "{":
        if currentKey is None:
            raise Exception("Current key not set!")

        newDict = { }
        dictStack[0][currentKey] = newDict
        dictStack.insert(0, newDict)
        currentKey = None
    elif l == "}":
        if currentKey is not None:
            raise Exception("Current key is set, expecting {")

        if len(dictStack) == 1:
            raise Exception("Can't remove the final dict, there seems to be an extra '}'")
        dictStack.pop(0)
    else:
        if currentKey is not None:
            raise Exception("Current key is set, expecting {")

        if not "=" in l:
            raise Exception("Expecting '=' in '{}'".format(l))

        key, value = l.split("=")
        key, value = key.strip(), value.strip() # remove whitespace
        if not value:
            currentKey = key
        else:
            dictStack[0][key] = value


if len(dictStack) != 1:
    raise Exception("Still more than one dict in the stack")

result = dictStack[0]

这是我使用递归的解决方案:

import re

def text2dict(text):
    def f(ls, i):
        d = {}

        while i < len(ls):
            if ls[i]=="}":
                return d, i

            m = re.match(r"(.*)=(.*)", ls[i])
            k = m.group(1).strip()
            v = m.group(2).strip()

            if not len(v):
                v, i = f(ls, i+2)
            d[k] = v
            i += 1
        return d
    return f([l.strip() for l in text.split("\n")], 0)

with open("file.txt") as f:
    text = f.read()
print(text2dict(text))
def make_dict(text):
    l = "{"
    t = text.splitlines()
    for j,i in enumerate(t):
        if i != '':
            line = i.replace(" ", "").split('=')
            next = t[j + 1].replace(" ", "").split('=')[0] if len(t) > (j + 1) else "}"
            if line[0] == "{" or line[0] == "}":
                l += line[0]
            else:   
                l += ("'"+line[0] + "':" + ("'"  + line[1] + "'" + ("," if next != "}" else "") + "" if line[1] != '' else ""))
    l += "}"            
    print(l)            

make_dict(text)

结果:

{'unit':'9023','state':'1411','flags':{'1NobelChemistry':'yes','1NobelLiterature':'yes','1NobelMedicine':'yes'}'worldmarket':{'worldmarket_pool':{'ammunition':'204.50766'}}}