Помогите прочитать .json файл

Рейтинг: 0Ответов: 1Опубликовано: 07.03.2023

Написал я код что бы программа с импротированием 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'

Ответы

▲ 0

В списке несколько словарей, в каждом из которых ПО ОДНОМУ ключу. В первом словаре (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)).