Я пытаюсь создать профили и сохранить данные json в текстовый файл, что я успешно выполнил, теперь я хочу иметь возможность искать в моем файле json и добавлять каждое имя профиля в выпадающий список. Вот пример сгенерированных данных JSON.
{
"profile": [
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}
]
}
То, что я пытался сделать с этим, это получить доступ к данным с помощью цикла, сказав
with open('profiles.txt', 'r') as file:
profiles = json.load(file)
for profile in profiles['profile']:
profiles_select['values'] = profile['profile_name']
Это решение работает, но только с одним профилем, как только я добавляю второй профиль, я получаю эту ошибку
Extra data: line 19 column 1 (char 430)
Файл JSON с более чем одним профилем будет выглядеть следующим образом
{
"profile": [
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}
]
}
{
"profile": [
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}
]
}
поэтому я подумал, что это потому, что он не знает, когда останавливать или начинать проверку каждого значения, поэтому я попытался пройти по строкам в файлах. Я пробовал этот код
with open('profiles.txt', 'r') as file:
lines = file.readlines()
for lines in file:
profile_data = json.load(file)
for profile in profile_data['profile']:
profiles_select['values'] = profile['profile_name']
Это не приводит к ошибкам, но не возвращает текст в поле со списком профиля. Если у кого-то есть понимание, это было бы очень полезно.
Вот как я написал мои данные JSON
def save_profile():
try:
with open('profiles.txt', 'r', encoding='utf-8') as infile:
load_data_profile = json.load(infile)
except:
load_data_profile = {'profile': []} # default when file can't be read
load_data_profile['profile'].append({
'profile_name': profile_name_entry.get(),
'first_name': first_name_entry.get(),
'last_name': last_name_entry.get(),
'address': house_address_entry.get(),
'address2': house_address2_entry.get(),
'city': city_entry.get(),
'country': country_entry.get(),
'state': state_entry.get(),
'zip': zip_entry.get(),
'card_type': card_type_entry.get(),
'card_number': card_number_entry.get(),
'exp_month': card_exp_month_date_entry.get(),
'exp_year': card_exp_year_date_entry.get(),
'card_cvv': card_cvv_entry.get(),
'phone': phone_entry.get(),
'email': email_entry.get()
})
with open('profiles.txt', 'w', encoding='utf-8') as outfile:
json.dump(load_data_profile, outfile, indent=4)
Всего 1 ответ
Ваш JSON неверен, поэтому предположим, что на самом деле это выглядит более чем для одного профиля:
[{
"profile": [
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}
]
},
{
"profile": [
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}
]
}]
Теперь в этом случае вы сможете разобрать это так:
with open('profiles.txt', 'r') as file:
profiles = json.load(file)
for item in profiles:
profile = item["profile"]
profiles_select['values'] = profile['profile_name']
Но учтите, что на самом деле здесь вам не нужен ключ profile
. Вы можете просто иметь массив объектов JSON:
[{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
},
{
"profile_name": 'name',
"address": 'address',
"city": 'yorktown',
}]
И тогда есть:
with open('profiles.txt', 'r') as file:
profiles = json.load(file)
for profile in profiles:
profiles_select['values'] = profile['profile_name']