Вот несколько советов.
Разобрать ввод в список списков с помощью csv.reader :
>>> rows = list(csv.reader(source.splitlines()))
Прокрутите список, чтобы построить свой словарь и суммировать затраты. В зависимости от структуры, которую вы хотите создать, сборка может выглядеть примерно так:
>>> summary = []
>>> for region, company, department, expense, cost in rows[1:]:
summary.setdefault(*region, company, department), []).append((expense, cost))
Запишите результат с помощью json.dump :
>>> json.dump(summary, open('dest.json', 'wb'))
Надеюсь, приведенная ниже рекурсивная функция поможет вам начать работу. Он строит дерево из входных данных. Пожалуйста, знайте, какого типа вы хотите, чтобы ваши листья были, что мы помечаем как «стоимость». Вам нужно будет уточнить эту функцию, чтобы создать точную структуру, которую вы намереваетесь:
import csv, itertools, json
def cluster(rows):
result = []
for key, group in itertools.groupby(rows, key=lambda r: r[0]):
group_rows = [row[1:] for row in group]
if len(group_rows[0]) == 2:
result.append({key: dict(group_rows)})
else:
result.append({key: cluster(group_rows)})
return result
if __name__ == '__main__':
s = '''\
Gondwanaland,Bobs Bits,Operations,nuts,332
Gondwanaland,Bobs Bits,Operations,bolts,254
Gondwanaland,Maureens Melons,Operations,nuts,123
'''
rows = list(csv.reader(s.splitlines()))
r = cluster(rows)
print json.dumps(r, indent=4)