如何在python的嵌套字典中获取文件的内容?

如何在python的嵌套字典中获取文件的内容?,python,Python,我正在尝试读取一个txt文件,并将内容放入嵌套字典中。文件内容如下 Name: John Doe Email: john.doe@exabeam.com Name: Martina jackson Email: Martina.jackson@exabeam.com Name: Steve Bob Email: steve.bob@exabeam.com Name: John Doe Email: john.doe@exabeam.com Name: Steve Bob Email: s

我正在尝试读取一个txt文件,并将内容放入嵌套字典中。文件内容如下

Name: John Doe
Email: john.doe@exabeam.com

Name: Martina jackson
Email: Martina.jackson@exabeam.com

Name: Steve Bob
Email: steve.bob@exabeam.com

Name: John Doe
Email: john.doe@exabeam.com

Name: Steve Bob
Email: steve.bob@exabeam.com

Name: John Doe
Email: john.doe@exabeam.com
我的目的是对文件内容进行排序,以便名称应为键,并且对于每个名称,电子邮件被提及的次数应作为值在嵌套的dict中。以下是示例输出:

{ "John Doe": {"John.doe@exabeam.com": 3}, "Steve Bob": {"steve.bob@exabeam.com": 2}, "Martina Jackson":{"martina.jackson": 1}} 
所以,我尝试了如下的方法。但它不起作用

with open('contacts', 'r') as file:
    for read_file in file:
        new_dict = sorted(read_file.items(), key = lambda x: x[1]['point'],reverse=True)
        print(new_dict)
当我执行上述程序时,我得到以下错误:

 new_dict = sorted(read_file.items(), key = lambda x: x[1]['point'],reverse=True)
AttributeError: 'tuple' object has no attribute 'items'
有什么想法吗

谢谢你,像这样的事

联系人={} 打开'contacts.txt','r'作为f: name=None 对于f中的行: parts=行.rstrip.split':' 如果部件[0]=“名称”: 名称=零件[1] 如果联系人中没有姓名: 联系人[姓名]={}为新姓名初始化空dict elif部件[0]=“电子邮件”: 电子邮件=部分[1] 如果电子邮件不在联系人[姓名]中: 联系人[姓名][电子邮件]=0初始化新电子邮件的计数 联系人[姓名][电子邮件]+=1 printcontacts输出:{'John Doe':{'John。doe@exabeam.com“:3},‘玛蒂娜·杰克逊’:{‘玛蒂娜。jackson@exabeam.com“:1},‘史蒂夫·鲍勃’:{‘史蒂夫。bob@exabeam.com': 2}} 这个怎么样

result = {}

with open(filename, "r") as f:
    lines = f.readlines()
    
    for name_line, address_line in zip(lines[::3], lines[1::3]):
        name = name_line.replace(": ", ":").split(":")[1].strip()
        address = address_line.replace(": ", ":").split(":")[1].strip()

        if not name in result:
            result[name] = {address: 1}
        else:
            result[name][address] += 1

我不明白为什么这样的数据结构是有利的

{name:email,count} 可能会更好,因为我每个名字只看到一封电子邮件

但这会将数据解析为您指定的格式:

结果=dict 打开“联系人”、“r”作为文件: 从文件中读取所有行 lines=file.readlines 把它们分块处理 对于0范围内的i,lenlines,3: 姓名,电子邮件,u=行[i:i+3] 删除名称:和电子邮件:以及换行符 名称=名称。拆分:[1]。拆分 电子邮件=电子邮件。拆分:[1]。拆分 如果我们以前没有见过这个名字,初始化dict 如果结果中没有名称: 结果[名称]=dict 增加查看电子邮件的次数,否则设置为1 结果[名称][电子邮件]=结果[名称].getemail,0+1 打印结果 打印,如预期的那样

{'John Doe': {'john.doe@exabeam.com': 3}, 'Martina jackson': {'Martina.jackson@exabeam.com': 1}, 'Steve Bob': {'steve.bob@exabeam.com': 2}}
又是一个例子

with open('contacts', 'r') as file:
    for read_file in file.read().split("\n\n"): #data chunks apart
        data = read_file.split("\n") #split email/name
        name = data[0].split(" ")[1] #split at space and grab second
        email = data[1].split(" ")[1] #^
        if name not in d:
            d[name] = {email:1}
        else:
            d[name][email] += 1

根据您的输入文件结构,您的错误应该是“string”对象没有属性“items”,也没有元组。您能再次确认输入吗?这样,每个人的名字首先都有一个空格。为了防止它,我们必须将:替换为:无空间。