Создание вложенной функции словаря с использованием текстового файла на Python

#python #string #dictionary #nested #text-files

Вопрос:

Я пытаюсь создать вложенную функцию 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. ПРОЧИТАЙТЕ()»

 {'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'}}
 

ПЕРЕЧИТЫВАЕТ ВСЕ ЗАНОВО

Комментарии:

1. когда вы все прочитаете, вы сможете разделить значения с помощью ключей на две части. Ты пробовал это сделать?

2. for line in f: читает каждую строчку. Звонок f.read() читает другую строку. Так что ты пропускаешь все остальные строки.

3. На данный момент отступ print(data3) будет выводить только одну, последнюю, строку в цикле.

4. Вы можете прочитать как CSV, используя | разделитель, а затем обработать первый столбец в два отдельных ключа.

Ответ №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)
 

Комментарии:

1. Почему вы используете много вызовов data_dict.update() вместо того, чтобы просто поместить все ключи в словарь сразу?

2. data_dict = {key1: value1, key2: value2, ...}

3. Или просто иметь ключи отдельно list и использовать dict(zip())

4. Я согласен, что это можно было бы написать более чистым способом. Сначала я сосредоточился на решении его проблемы.

Ответ №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']
 

Комментарии:

1. спасибо за помощь, но если мы поместим все это в список, как я могу назвать конкретный словарь? потому что я хочу, чтобы в нем была показана часть диктанта в соответствии с используемым именем

2. Я добавлю в конец кода кое-что, что может вам помочь

Ответ №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 .

ОБНОВЛЕНИЕ: Я отредактировал свой код, чтобы создать диктант и получить доступ к каждой записи по имени пользователя.

Комментарии:

1. еще одна вещь, я не могу вызвать диктант со значением ключа (имя пользователя). Могу я узнать, как бы вы добавили это в свой код

2. Если я понимаю, о чем вы спрашиваете, вы хотите иметь все записи в диктанте и получать доступ к отдельным записям по ключевому имени пользователя, например «jiken». Я обновил свой ответ, чтобы сделать это.