动态构建字典时出现Python“键错误”(即时)

时间:2019-02-11 03:24:07

标签: python json dictionary

我在这行代码上收到错误-

result_dict['strat'][k]['name'] = current_comps[0].strip()
The error is : Keyerror: 'strat'

我有输入行

PERSON1 @@ CAR1 # ENTRY : 0 | EXIT : 0 @@ CAR2 # M1 : YES : 10/01/17 02:00 | M2 : NO : 10/02/16 03:00 | M3 : NO : 05/07/17 11:00 | M4 : YES : 01/01/16 03:00 @@ TRUCK # M3 : NO : 03/01/17 03:45 | M23 : NO : 01/01/14 07:00 | M27 : YES : 02/006/18 23:00

我正在寻求解析此输入以生成下面详细介绍的输出。作为此过程的一部分,我正在尝试构建一个字典,以动态插入键和值。我在执行此操作时遇到很多问题。

请问可以帮忙吗?

这是我到目前为止尝试过的-

# File read
f = open('input_data', 'r')
file_cont = f.read().splitlines()
f.close()

#json template

# Initialize dictionary
result_arr = []
result_dict = {}
k = 0

for item in file_cont:
    strat = item.split('@@')
    result_dict['Person'] = strat[0].strip()
    j = 1
    while j < len(strat):
        # Split various components of the main line
        current_comps = strat[j].split('#')

        # Name of strat being parsed
        result_dict['strat'][k]['name'] = current_comps[0].strip()

        # tfs across the various time frames
        tfs = current_comps[1].split('|')

        # First travel mode
        if current_comps[0].strip() == 'CAR1':
            temp_low_arr = tfs[0].split(':')
            temp_high_arr = tfs[1].split(':')
            result_dict['strat'][k]['Entry'] = temp_low_arr[1].strip()
            result_dict['strat'][k]['Exit'] = temp_high_arr[1].strip()

        # Second travel mode
        elif current_comps[0].strip() == 'CAR2':
            z = 0
            while z < len(tfs):
                # Split components of the sign
                sign_comp_car_2 = tfs[z].split(':')
                result_dict['strat'][k]['tf'][z]['path'] = sign_comp_ma_cross[0].strip()
                result_dict['strat'][k]['tf'][z]['sign'] = sign_comp_ma_cross[1].strip()
                result_dict['strat'][k]['tf'][z]['sign_time'] = sign_comp_ma_cross[2].strip()
                z += 1

        # Third travel mode
        elif current_comps[0].strip() == 'CAR3':
            b = 0
            while b < len(tfs):
                # Split components of the sign
                sign_car_3 = tfs[z].split(':')
                result_dict['strat'][k]['tf'][b]['path'] = sign_all_term[0].strip()
                result_dict['strat'][k]['tf'][b]['sign'] = sign_all_term[1].strip()
                result_dict['strat'][k]['tf'][b]['sign_time'] = sign_all_term[2].strip()
                b += 1
    j += 1
k += 1

预期产量

[{  
   "Person":"",
   "Transport":[  
      {  
         "Name":"CAR1",
         "Entry":"0",
         "Exit":"0"
      },
      {  
         "name":"CAR2:",
         "tf":[  
            {  
               "path":"M1",
               "sign":"YES",
               "sign_time":"10/01/17 02:00"
            },
            {  
               "path":"M2",
               "sign":"NO",
               "sign_time":"10/02/16 03:00"
            },
            {  
               "path":"M3",
               "sign":"NO",
               "sign_time":"05/07/17 11:00"
            },
            {  
               "path":"M4",
               "sign":"YES",
               "sign_time":"01/01/16 03:00"
            }
         ]
      },
      {  
         "name":"CAR3",
         "tf":[  
            {  
               "path":"M3",
               "sign":"NO",
               "sign_time":"03/01/17 03:45"
            },
            {  
               "path":"M23",
               "sign":"NO",
               "sign_time":"01/01/14 07:00"
            },
            {  
               "path":"M27",
               "sign":"Yes",
               "sign_time":"02/006/18 23:00"
            }
         ]
      }
   ]
}]

1 个答案:

答案 0 :(得分:1)

问题是,当['name']尚未初始化时,当您尝试在result_dict['strat'][k]中分配result_dict['strat'][k]字段时。在运行for循环之前,该词典没有名为strat的键。 现在您可以完成类似result_dict['strat'] = dict()的操作(将对象分配给字典中的键),但是当您使用result_dict['strat'][k]下标它时,它将首先尝试通过访问{{1 }},期望返回可下标的集合或字典。但是,由于该键尚不存在,因此会引发错误。

相反,您可以做的是初始化默认字典:

result_dict['strat']

否则,在现有代码中,您可以在进入循环之前在from collections import defaultdict ... resultdict = defaultdict(dict) ... 中初始化一个字典。