how to fix TypeError: format requires a mapping

Denis McMahon denismfmcmahon at gmail.com
Thu Jul 2 03:20:09 CEST 2015


On Wed, 01 Jul 2015 14:57:14 -0700, hinaimran.mehr wrote:

> I am pulling my hair with this problem right now,
> 
> I have the following Data structure
> 
>     [<OldSample {u'counter_name': u'cpu_util', u'user_id': u'id',
>     u'resource_id': u'id', u'timestamp': u'2015-06-30T15:53:55',
>     u'counter_volume': 0.043}]

This isn't a print out of any python data structure that I recognise. I 
assume you have a list of dictionaries, and that each dictionary 
represents one sample.

> I need to make it something like this to put in EON pubnub charting
> libaray (see link: http://www.pubnub.com/developers/eon/chart/spline/)
> 
>     message: {
>           columns: [
>             ["y": 0.043, "x": "2015-06-30T15:53:55"],
>             ["y": 0.045, "x": "2015-06-30T15:53:55"]
>           ]
> 
> Now I have the following code
> 
>     data = cclient.samples.list(meter_name ='cpu_util', limit=2)
> 
> result_rows = []
> for row in data:
>      formatted = """["y": %(counter_volume)0.3f, "x":
>      "%(timestamp)s"]""" % (row)
>      result_rows.append(formatted)
>      
>      print(',\n'.join(result_rows))
> 
> 
> clean_json(data)

I assume you want the output as json.

The solution may be to put the data into a suitable structure and dump 
the structure to json.

import json

thing = {}
msg = {}
cols = []

for row in data:
    col = {}
    col['x'] = row['timestamp']
    col['y'] = row['counter_volume']
    cols.append(col)

msg['columns'] = cols

thing['message'] = msg

print thing

print json.dumps(thing)


-- 
Denis McMahon, denismfmcmahon at gmail.com


More information about the Python-list mailing list