代码之家  ›  专栏  ›  技术社区  ›  Ratha

从字典中读取时,我得到“int”对象没有属性“getitem”错误

  •  -2
  • Ratha  · 技术社区  · 6 年前

    在一个python文件中,我将值存储在字典中 如:

     messageDict[ObservationRawDataId] = {'timestamp': TimeStamp, 'tanksystemid': TankSystemId,
                            'newDelivery': delivery,'oldDelivery':RawDeliveryLitres ,'grade' :ProductName,'sitecode':SiteCode}
     formMessageBody(messageDict)
    

    在另一个python文件中,我试图从字典中构造一个纯文本消息;

    def formMessageBody( messageDict) :
        try :
            print 'SiteCode', 'Date', 'Product', 'NewDelievry','OldDelivery'
            for tuple_a in messageDict.items():
                for dic_a in tuple_a:
                    print tuple_a
                    print dic_a['sitecode']
                    print  dic_a['sitecode'], dic_a['timestamp'], dic_a['grade'],
                                                                dic_a['newDelivery'],dic_a['oldDelivery']
        except Exception as error:
            print format(error)
    

    但我无法从元组中读取值。 元组a打印为;

    (14118912, {'newDelivery': '8397.000', 'grade': u'Unleaded', 'timestamp': datetime.datetime(2019, 6, 23, 0, 0), 'tanksystemid': 5977, 'oldDelivery': 8397.0, 'sitecode': u'1156'})
    

    当我试图找回; 迪库a['sitecode'] dic_a[“时间戳”] 我得到了;

    'int' object has no attribute '__getitem__'
    

    错误。 我在这里做错什么了?

    MessageDict看起来很利克;

    {14090233: {'newDelivery': '5009.000', 'grade': u'E10', 'timestamp': datetime.datetime(2019, 6, 21, 0, 0), 'tanksystemid': 5776, 'oldDelivery': 5009.0, 'sitecode': u'4169'}, 14129146: {'newDelivery': '17091.000', 'grade': u'Unleaded', 'timestamp': datetime.datetime(2019, 6, 24, 0, 0), 'tanksystemid': 8720, 'oldDelivery': 17091.0, 'sitecode': u'2328'}, 14118907: {'newDelivery': '13797.000', 'grade': u'Unleaded', 'timestamp': datetime.datetime(2019, 6, 23, 0, 0), 'tanksystemid': 5973, 'oldDelivery': 13797.0, 'sitecode': u'1151'}, 14145533: {'newDelivery': '8281.000', 'grade': u'PULP', 'timestamp': datetime.datetime(2019, 6, 24, 0, 0), 'tanksystemid': 5360, 'oldDelivery': 8281.0, 'sitecode': u'2212'}, 14129150: {'newDelivery': '7099.000', 'grade': u'Diesel', 'timestamp': datetime.datetime(2019, 6, 24, 0, 0), 'tanksystemid': 8724, 'oldDelivery': 7099.0, 'sitecode': u'2328'}, 14129565: {'newDelivery': '16619.100', 'grade': u'Unleaded', 'timestamp': datetime.datetime(2019, 6, 24, 0, 0), 'tanksystemid': 10012, 'oldDelivery': 16619.1, 'sitecode': u'4217'}}
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   iz_    6 年前

    看起来您只想迭代字典的值。如果是这样,您可以通过遍历 messageDict.values() .这还消除了对内部for循环的需要:

    for dic_a in messageDict.values():
        print dic_a['sitecode']
        print dic_a['sitecode'], dic_a['timestamp'], dic_a['grade'],
              dic_a['newDelivery'], dic_a['oldDelivery']
    
        2
  •  2
  •   rithvikp    6 年前

    其他人已经指出了这个问题,我将试着再解释一点,为什么会发生这种情况。

    你的 messageDict 是一本字典 ObservationRawDataId 作为键和另一个dict作为值。当你打电话 messageDict.items() ,它返回一个元组 (ObservationRawDataId, {'timestamp': TimeStamp... ,所以元组中的第一个值是 观测数据ID 而不是 dic_a 如你所料。如果要迭代这些值,可以按照@tomothy32的建议执行:

    for dic_a in messageDict.values():
        print dic_a['sitecode']
        print dic_a['sitecode'], dic_a['timestamp'], dic_a['grade'],
              dic_a['newDelivery'], dic_a['oldDelivery']
    

    或者如果你想用 观测数据ID 在循环中的某个地方,您也可以使用:

    for rawDataId in messageDict.keys():
        dic_a = messageDict[rawDataId]
        print dic_a['sitecode']
        print dic_a['sitecode'], dic_a['timestamp'], dic_a['grade'],
              dic_a['newDelivery'], dic_a['oldDelivery']
    
        3
  •  0
  •   Rahul Kumar    6 年前

    当您遍历由 messageDict.items() ,你得到了 关键值 成对(在你的例子中是int dict pairs)。似乎您只希望遍历值。

    正如你在打印元组时提到的,你会得到

    (14118912,{'newdelivery':'8397.000','grade':u'unleaded','timestamp':datetime.datetime(2019,6,23,0,0),'tanksystemid':5977,'oldelivery':8397.0,'sitecode':u'1156'})

    注意元组中的第一个对象。 所以通过内环的第一次迭代,变量 dic_a 商店 14118912 打电话来 dic_a['sitecode'] 是什么导致了一个错误,因为一个int对象当然不支持这个(这必须是抛出的属性错误)。

    我想你想做的是打电话 messageDict.values() 它只返回字典中的值列表(在您的情况下是字典对象列表)。