#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». Я обновил свой ответ, чтобы сделать это.