Помогите прочитать .json файл
Написал я код что бы программа с импротированием Tkinter и с виджетом Treeview считывала данные с .json файла. Вот код:
data_list = [
{
"Date": ""
},
{
"Service": ""
},
{
"Month": ""
},
{
"Borrow": ""
},
{
"Spent": ""
}
]
def openFile():
global file_name
global tree
global count
pathFile = filedialog.askopenfilename(
initialdir="/bills",
title="Open a file",
filetypes=(("Json Document", "*.json"), ("All files", "*.*"))
)
file_name = pathFile
print(pathFile)
with open(file_name) as f:
data = json.load(f)
for record in tree.get_children():
tree.delete(record)
for i in range(len(data)):
date = data[i]["Date"]
service = data[i]["Service"]
month = data[i]["Month"]
borrow = data[i]["Borrow"]
spent = data[i]["Spent"]
tree.insert(parent="", index="end", iid=count, values=(date, service, month, borrow, spent))
count += 1
И вот собственно говоря какую ошибку он нашёл:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Program Files (x86)\Thonny\lib\tkinter\__init__.py", line 1921, in __call__
return self.func(*args)
File "C:\Users\5kara\OneDrive\Рабочий стол\pyProjects\bills\bills.py", line 116, in openFile
service = data[i]["Service"]
KeyError: 'Service'
Ответы (1 шт):
В списке несколько словарей, в каждом из которых ПО ОДНОМУ ключу. В первом словаре (data[0]) содержится ключ "Date", поэтому строка date = data[i]["Date"] при i = 0 нормально выполняется. А ключа "Service" в первом словаре нет. Поэтому возникает ошибка. Точно так же в первом словаре нет и других ключей. Идентичные ошибки возникали бы при обращении к следующим словарям, т.к. в data[2] ключ "Month" хоть и есть, но всех остальных нет.
date = data[i]["Date"]
service = data[i]["Service"]
month = data[i]["Month"]
borrow = data[i]["Borrow"]
spent = data[i]["Spent"]
Практический совет тут дать сложно, потому что очевидно, что структура джейсона не самая оптимальная, да и непонятно, что должен делать код. Можно было бы завернуть тело цикла в try..except, но тогда будут ошибки в строке tree.insert(parent="", index="end", iid=count, values=(date, service, month, borrow, spent)).