This is my current code:
import csv data = {'name' : ['Dave', 'Dennis', 'Peter', 'Jess'], 'language': ['Python', 'C', 'Java', 'Python']} new_data = [] for row in data: new_row = {} for item in row: new_row[item['name']] = item['name'] new_data.append(new_row) print(new_data) header = new_data[0].keys() print(header) with open('output.csv', 'w') as fh: csv_writer = csv.DictWriter(fh, header) csv_writer.writeheader() csv_writer.writerows(new_data)
What I am trying to achieve is that the dictionary keys are turned into the csv headers and the values turned into the rows.
But when running the code I get a TypeError: 'string indices must be integers'
in line 21.
Advertisement
Answer
Problem
The issue here is for row in data
. This is actually iterating over the keys of your data
dictionary, and then you’re iterating over the characters of the dictionary keys:
In [2]: data = {'name' : ['Dave', 'Dennis', 'Peter', 'Jess'], ...: 'language': ['Python', 'C', 'Java', 'Python']} ...: ...: new_data = [] ...: for row in data: ...: for item in row: ...: print(item) ...: n a m e l a n g u a g e
Approach
What you actually need to do is use zip
to capture both the name and favorite language of each person at the same time:
In [43]: for row in zip(*data.values()): ...: print(row) ...: ('Dave', 'Python') ('Dennis', 'C') ('Peter', 'Java') ('Jess', 'Python')
Now, you need to zip
those tuples with the keys from data
:
In [44]: header = data.keys() ...: for row in zip(*data.values()): ...: print(list(zip(header, row))) ...: [('name', 'Dave'), ('language', 'Python')] [('name', 'Dennis'), ('language', 'C')] [('name', 'Peter'), ('language', 'Java')] [('name', 'Jess'), ('language', 'Python')]
Solution
Now you can pass these tuples to the dict
constructor to create your rowdicts
which csv_writer.writerows
requires:
header = data.keys() new_data = [] for row in zip(*data.values()): new_data.append(dict(zip(header, row))) with open("output.csv", "w+", newline="") as f_out: csv_writer = csv.DictWriter(f_out, header) csv_writer.writeheader() csv_writer.writerows(new_data)
Output in output.csv
:
name,language Dave,Python Dennis,C Peter,Java Jess,Python