【问题标题】:Creating nested dictionary function using text file in Python在 Python 中使用文本文件创建嵌套字典函数
【发布时间】:2021-10-12 07:34:59
【问题描述】:

我正在尝试创建一个嵌套的 if 函数,其中用户名是主字符串,其他人是子字符串。但是由于某种原因,它没有分隔行,而是创建了多个嵌套字典,而现在它只是卡在了文本文件的第一行。请帮忙

我的文本文件

shanm = null|Shanmugaraja|09/04/2002|0149606345|020409140817|0102393345|4770 4848 0109 0294
jiken = null|Soo Jiken|08/06/2000|0149600239|020908140213|011349780|8900 2828 1129 0889

我的嵌套字典代码

with open("something.txt", 'r') as f:
    data_dict = {}
    data_dict2 = {}
    data3 = {}
    for line in f:
        f.read()
        k, v = line.strip().split("=")
        listDetails = line.strip().split('|')
        data_dict = {"Full Name": listDetails[1]}
        data_dict.update({"Date of Birth": listDetails[2]})
        data_dict.update({"Phone Number": listDetails[3]})
        data_dict.update({"Identification Card (IC) Number": listDetails[4]})
        data_dict.update({"Emergency Contact Number": listDetails[5]})
        data_dict.update({"Credit /Debit Card Details ": listDetails[6]})
        data3[k] = data_dict
 print(data3)

期望的输出

{'shanm ': {'Full Name': 'Shanmugaraja', 'Date of Birth': '09/04/2002', 'Phone Number': '0149606345', 'Identification Card (IC) Number': '020409140817', 'Emergency Contact Number': '0102393345', 'Credit /Debit Card Details ': '4770 4848 0109 0294'}}

{'jiken ': {'Full Name': 'Soo Ji', 'Date of Birth': '08/06/2000', 'Phone Number': '0149600239', 'Identification Card (IC) Number': '020908140213', 'Emergency Contact Number': '011349780', 'Credit /Debit Card Details ': '8900 2828 1129 0889'}}

收到输出

{'shanm ': {'Full Name': 'Shanmugaraja', 'Date of Birth': '09/04/2002', 'Phone Number': '0149606345', 'Identification Card (IC) Number': '020409140817', 'Emergency Contact Number': '0102393345', 'Credit /Debit Card Details ': '4770 4848 0109 0294'}}
#NOT READING THE NEXT PART OF THE LINE

或(没有“F.READ()”

{'shanm ': {'Full Name': 'Shanmugaraja', 'Date of Birth': '09/04/2002', 'Phone Number': '0149606345', 'Identification Card (IC) Number': '020409140817', 'Emergency Contact Number': '0102393345', 'Credit /Debit Card Details ': '4770 2828 0109 0394'}}
{'shanm ': {'Full Name': 'Shanmugaraja', 'Date of Birth': '09/04/2002', 'Phone Number': '0149606345', 'Identification Card (IC) Number': '020409140817', 'Emergency Contact Number': '0102393345', 'Credit /Debit Card Details ': '4770 2828 0109 0394'}, 'jiken ': {'Full Name': 'Soo Jiken', 'Date of Birth': '08/06/2000', 'Phone Number': '0149600239', 'Identification Card (IC) Number': '020908140213', 'Emergency Contact Number': '011349780', 'Credit /Debit Card Details ': '8900 2828 1129 0889'}}

重新阅读所有内容

【问题讨论】:

  • 当您阅读所有内容时,您可以随后将带有键的值分成两个字典。你试过了吗?
  • for line in f: 读取每一行。调用f.read() 读取另一行。所以你跳过了每一行。
  • 目前print(data3) 的缩进只会打印循环中的最后一行。
  • 您可以使用 | 分隔符将其读取为 CSV,然后将第一列处理为两个单独的键。

标签: python string dictionary nested text-files


【解决方案1】:

尝试将您的代码更新为:

with open("something.txt", 'r') as f:
    data_dict = {}
    data3 = {}
    for line in f.readlines():
        k, v = line.strip().split("=")
        listDetails = line.strip().split('|')
        data_dict = {"Full Name": listDetails[1]}
        data_dict.update({"Date of Birth": listDetails[2]})
        data_dict.update({"Phone Number": listDetails[3]})
        data_dict.update({"Identification Card (IC) Number": listDetails[4]})
        data_dict.update({"Emergency Contact Number": listDetails[5]})
        data_dict.update({"Credit /Debit Card Details ": listDetails[6]})
        data3[k] = data_dict
print(data3)

【讨论】:

  • 你为什么要多次调用data_dict.update() 而不是一次将所有键都放入字典中?
  • data_dict = {key1: value1, key2: value2, ...}
  • 或者只是将密钥作为单独的list 并使用dict(zip())
  • 我同意这可以用更简洁的方式编写。我首先专注于解决他的问题。
【解决方案2】:

看起来您想要一个字典列表。如果是这样,你可以这样做:

keys = ['Full name', 'Date of Birth', 'Phone Number',
        'Identification Card (IC) Number', 'Emergency Contact Number', 'Credit /Debit Card Details']

lod = []

with open('something.txt') as infile:
    for line in infile:
        key, v = line.split('=')
        d = {}
        for k, v in zip(keys, v.split('|')[1:]):
            d[k] = v
        lod.append({key.strip(): d})
for d in lod:
    name = list(d.keys())[0]
    print(d[name]['Full name']

【讨论】:

  • 感谢您的帮助,但是如果我们将它们全部放在一个列表中,我该如何调出特定的字典?因为我希望它根据使用的名称显示字典的一部分
  • 我会在代码末尾添加一些内容,可能会对您有所帮助
【解决方案3】:
keys = ["Full Name", "Date of Birth", "Phone Number",
        "Identification Card (IC) Number", "Emergency Contact Number",
        "Credit /Debit Card Details "]
data = {}
with open("something.txt", 'r') as f:
    for line in f:
        key, values = line.strip().split(" = ") # note the space around =, to avoid trailing space in key
        values = values.split('|')
        data[key] = dict(zip(keys, values[1:]))}

print(data)
print(data.get('jiken'))

您可能希望将每个字典 data 存储在某种容器类型中,例如 list

更新:我编辑了我的代码以创建一个字典并通过用户名访问每条记录。

【讨论】:

  • 还有一件事,我似乎无法调用带有键值(用户名)的字典。我可以知道你会如何在你的代码中添加它
  • 如果我理解您的要求,您希望将所有记录保存在一个字典中并通过关键用户名访问单个记录,例如'吉肯'。我更新了我的答案来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 2021-03-04
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 2013-07-25
相关资源
最近更新 更多