4

I have a dictionary of dictionaries that I would like to write out to csv. my dictionary looks like:

dict={
    object1:
        {
            time1:[value1,value2],
            time2:[value3,value4]
        },
    object2:
        {
            time1:[value5,value6],time2[value7,value8]
        }
    }

I would like it to write out as:

object1

time1, value1, value2

time2, value3, value4

object2

time1, value5, value6

time2, value7, value8

Thus far, I can only figure out how to write the key/value pairs out csv using the following code:

writer = csv.writer(open('test.csv','wb'))
for key, value in Dict.items():
    writer.writerow([key,value])

So it looks like:

objcet1,{
    time1:[value1,value2],time2:[value3,value4]
}

objcet2,{
    time1:[value5,value6],time2:[value7,value8]
}

I have tried writing just the outer keys (keys labeled object1 and object2) using

writer = csv.writer(open('test.csv','wb'))
for key, value in Dict.key():
    writer.writerow([key])

but it just writes out a blank file. I think If I could figure out how to write the outer keys by themselves, I would be able to write out the csv as I want. Does anyone have any suggestions?

3 Answers 3

2

I personally recommend using Excel, I have been working on .csv files, but ended up using .xlsx.

import xlsxwriter
workbook = xlsxwriter.Workbook('File.xlsx')
worksheet = workbook.add_worksheet()                            
row = 0
col = 0
for key in dictionary.keys():
    row += 1
    worksheet.write(row, col, key)
    for item in dictionary[key]:
        worksheet.write(row, col + 1, item)
        worksheet.write(row, col + 2, dictionary[key][item][0])
        row += 1

workbook.close()

And there you can change the columns and the rows increment so that you get the excel table you want to. You can even export it as a .csv file afterwards from Excel.

Sign up to request clarification or add additional context in comments.

Comments

1

Your expected output format looks very surprising and does not look like a sensible csv format.

However, this would result in exactly what you seem to be looking for :

>>> mydict = {'object1':{'time1':['value1','value2'],'time 2':['value3','value4']},'object2':{'time1':['value5','value6'],'time2':['value7','value8']}}

>>> print "\n".join(["%s %s " % (k, " ".join([", ".join([k1]+v1) for (k1,v1) in v.iteritems()])) for (k,v) in mydict.iteritems()])

object1 time1, value1, value2 time2, value3, value4 
object2 time1, value5, value6 time2, value7, value8 

1 Comment

This solution only works as long the values do not contain any characters that require CSV escaping, in particular commas, quotes and linefeeds. Using csv.writerow() would ensure that everything is escaped properly.
1

Try this:

import csv

writer = csv.writer(open('test.csv','wb'))
d={'object1':{'time1':['value1','value2'],'time2':['value3','value4']},
   'object2':{'time1':['value5','value6'],'time2':['value7','value8']}}
for key, value in d.iteritems():
    ln = [key]
    for ik, iv in value.iteritems():
        ln.append(ik)
        ln.extend([v for v in iv])
    writer.writerow(ln)

1 Comment

Thank you both for your help. Both of these suggestions output: object1, time1, value1, value2, time2, value3, value4 object2, time1, value5, value6, time2, value7, value8 and I am looking for: object1 time1, value1, value2 time2, value3, value4 object2 time1, value5, value6 time2, value7, value8 I'll take what you provided me, and see if I can tweak it to get what I want. If you have any suggestions, that would be great too. Thanks again!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.