从 python3 中的文本文件创建嵌套字典

Creating nested dictionary from text file in python3

我有一个包含数千个这样的块的文本文件。为了进行处理,我需要将其转换为字典。

文本文件模式

[conn.abc]
domain = abc.com
id = Mike
token = jkjkhjksdhfkjshdfhsd

[conn.def]
domain = efg.com
id = Tom
token = hkjhjksdhfks

[conn.ghe]
domain = ghe.com
id = Jef
token = hkjhadkjhskhfskdj7979

另一个示例数据

New York 
domain = Basiclink.com 
token = eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyIsImtpZCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyJ9.eyJhdWQiOiJodHRwczovL21zLmNvbS9zbm93 
method = http 
username = abc@comp.com 

Toronto 
domain = hollywoodlink.com 
token = eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyIsImtpZCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyJ9.eyJhdWQiOiJodHRwczovL21zLmNvbS9zbm93Zmxha2UvsfdsdcHJvZGJjcy1lYXN0LXVzLTIiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9lMjliODE 
method = http 
username = abc@comp.com

想把它转换成下面的。

d1={conn.abc:{'domain':'abc.com','id': 'Mike',token:'jkjkhjksdhfkjshdfhsd'}
 conn.def:{'domain':'efg.com', 'id': 'Tom',token:'hkjhjksdhfks'}
 conn.ghe:{'domain':'ghe.com', 'id': 'Jef',token:'hkjhadkjhskhfskdj7979'}}

谢谢

您可以使用标准 configparser 模块:

import configparser

config = configparser.ConfigParser()
config.read("name_of_your_file.txt")

然后你可以使用config作为标准字典:

for name_of_section, section in config.items():
    for name_of_value, val in section.items():
        print(name_of_section, name_of_value, val)

打印:

conn.abc domain abc.com
conn.abc id Mike
conn.abc token jkjkhjksdhfkjshdfhsd
conn.def domain efg.com
conn.def id Tom
conn.def token hkjhjksdhfks
conn.ghe domain ghe.com
conn.ghe id Jef
conn.ghe token hkjhadkjhskhfskdj7979

或:

print(config["conn.abc"]["domain"])

打印:

abc.com

由于输入文件的数据行数可能不同,因此此代码应该可以工作。

假设:

  1. 每个键(例如:conn.abc)将以左方括号开始并以左方括号结束。示例 [conn.abc]
  2. 每个内部字典键值将由 =
  3. 分隔

如果键值可以是 [key]key,则使用下面的代码行而不是注释的代码行。

    elif '=' not in line:
    #elif line[0] == '[' and line[-1] == ']':

代码是:

with open('abc.txt', 'r') as f:
    d1 = {}
    for i, line in enumerate(f):
        line = line.strip()
        if line == '': continue
        elif line[0] == '[' and line[-1] == ']':
            if i !=0: d1[dkey]= dtemp
            dkey = line[1:-1]
            dtemp = {}
        else:
            line_key,line_value = line.split('=')
            dtemp[line_key.strip()] = line_value.strip()
    d1[dkey]=dtemp

print (d1)

如果输入文件是:

[conn.abc]
domain = abc.com
id = Mike
token = jkjkhjksdhfkjshdfhsd

[conn.def]
domain = efg.com
id = Tom
dummy = Test
token = hkjhjksdhfks

[conn.ghe]
domain = ghe.com
id = Jef
token = hkjhadkjhskhfskdj7979

输出结果如下:

{'conn.abc': {'domain': 'abc.com', 'id': 'Mike', 'token': 'jkjkhjksdhfkjshdfhsd'}, 
 'conn.def': {'domain': 'efg.com', 'id': 'Tom', 'dummy': 'Test', 'token': 'hkjhjksdhfks'}, 
 'conn.ghe': {'domain': 'ghe.com', 'id': 'Jef', 'token': 'hkjhadkjhskhfskdj7979'}}

请注意,我添加了 dummy = Test 作为 conn.def 的键值。因此,您的输出将在输出中包含额外的 key:value。