首页 > 解决方案 > 从字典中读取时,我得到“int”对象没有属性“__getitem__”错误

问题描述

在一个 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)

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

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

当我尝试检索时;dic_a['sitecode'] dic_a['timestamp'] 我明白了;

'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'}}

标签: python

解决方案


其他人已经指出了这个问题,我将尝试更多地解释它为什么会以这种方式发生。

messageDict是一个以ObservationRawDataIdas 键和另一个 dict 作为值的字典。当您调用时messageDict.items(),它会返回一个元组(ObservationRawDataId, {'timestamp': TimeStamp...,因此元组中的第一个值是ObservationRawDataId而不是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']

或者,如果您也想ObservationRawDataId在循环中的某处使用,您可以使用:

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']

推荐阅读