В одном файле 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__'

Ошибка. Что я здесь не так делаю?

MessagetoDict выглядит так;

{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'}}
-2
Ratha 1 Июл 2019 в 06:47

3 ответа

Лучший ответ

Похоже, вы хотите только перебирать значения словаря. Если это так, вы можете выполнить это, выполнив итерацию 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
iz_ 1 Июл 2019 в 03:55

Когда вы перебираете список, возвращаемый messageDict.items(), вы получаете наборы пар ключ-значение (в вашем случае пары int-dict). Похоже, вы ожидаете, что будут перебираться только значения.

Как вы уже упоминали, когда вы печатаете кортеж, вы получаете

(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 сохраняет 14118912, и вызов dic_a['sitecode'] вызывает ошибку, поскольку объект int, конечно, не поддерживает это (это должно быть Атрибут __getitem__ выдан с ошибкой).

Я думаю, что вы хотели сделать это вызов messageDict.values(), который возвращает только список значений (в вашем случае список объектов словаря) в словаре.

0
Rahul Kumar 1 Июл 2019 в 04:32

Другие люди уже указали на проблему, я просто попытаюсь объяснить немного больше, почему это происходит так, как это происходит.

Ваш messageDict - это словарь с ключом ObservationRawDataId и другим значением в качестве значения. Когда вы вызываете 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']
2
rithvikp 1 Июл 2019 в 04:05