2016-07-19 5 views
2

Я вложенный словаря (с длиной> 70,000):от вложенного словаря в CSV файл

users_item = { 
    "sessionId1": { 
     "12345645647": 1.0, 
     "9798654": 5.0 

    },   
    "sessionId2":{ 
     "3445657657": 1.0 

    }, 
    "sessionId3": { 
     "87967976": 5.0, 
     "35325626436": 1.0, 
     "126789435": 1.0, 
     "72139856": 5.0  
    }, 
    "sessionId4": { 
     "4582317": 1.0   
    } 
...... 
} 

Я хочу создать CSV-файл из моего вложенного словаря, мой результат будет выглядеть следующим образом:

sessionId1 item rating 
sessionId1 item rating 
sessionId2 item rating 
sessionId3 item rating 
sessionId3 item rating 
sessionId3 item rating 
sessionId3 item rating 
....... 

Я нашел этот пост: Convert Nested Dictionary to CSV Table

Это похоже на мой вопрос, но он не работает, когда я пытаюсь ответить, pandas библиотека закончилась памяти

Как я могу сделать CSV-файл с моими данными?

+0

@ Ev.Kounis, извините за вопрос непонятный. Я редактирую свой вопрос! – Paldro

+0

Если вместо 'item' и' rating' вы имели фактические значения, это было бы ясно с самого начала. –

+0

@ ĐứcPhan вы пытались адаптировать принятый ответ из своей ссылки (он не использует 'panda', а' csv.DictWriter')? – Frodon

ответ

1

Просто пройдите через словарь и используйте Python csv writer для записи в файл csv.

with open('output.csv', 'w') as csv_file: 
    csvwriter = csv.writer(csv_file, delimiter='\t') 
    for session in users_item: 
     for item in users_item[session]: 
      csvwriter.writerow([session, item, users_item[session][item]]) 
+0

, вы должны знать' writow 'принимает ровно один аргумент, но в вашем коде, который вы указали 3. – Paldro

+0

@ Đức Phan Извините, забыли внешние скобки, исправленные сейчас. – mowcow

+0

это ошибка, которую ваш код: 'writer.writerow ([session, item, user_item [session] [item]]) TypeError: 'str' не поддерживает буферный интерфейс' – Paldro

0

Предполагая, что вы хотите каждую сессию как строки, число столбцов для каждой строки будет общее количество уникальных ключей во всех сеансах dicts. Основываясь на данных, которые вы указали, я предполагаю, что количество уникальных ключей является астрономическим.

Вот почему у вас проблемы с памятью с решением given in this discussion. Это просто слишком много данных для хранения в памяти за один раз.

Ваш единственный вариант, если мои предположения верны, состоит в том, чтобы разделить и победить. Разбивайте данные на более мелкие куски и записывайте их в файл в формате csv. Затем слейте файлы csv в конце.

0
for session, ratings in users_item.items(): 
    for rating, value in ratings.items(): 
     print("{} {}".format(session, value)) 

Выход:

sessionId3 5.0 
sessionId3 1.0 
sessionId3 5.0 
sessionId3 1.0 
sessionId1 5.0 
sessionId1 1.0 
sessionId4 1.0 
sessionId2 1.0 

Примечание что dict (user_items) имеет нет порядка. Поэтому, если вы не укажете порядок строк каким-либо другим способом, то вывод будет в том порядке, который используется dict.

Редактировать: У этого подхода нет проблем с файлом, содержащим 70 тыс. Записей.

Редактировать: Если вы хотите записать в CSV-файл, используйте модуль csv или просто подключите вывод к файлу.

+0

, но мне нужно записывать данные в файл csv, а не распечатывать! – Paldro

+0

Вы можете легко адаптировать мой ответ, используя https://docs.python.org/3/library/csv.html –

0

Если вы итеративно записи файла, не должно быть никаких проблем с памятью:

import csv 

users_item = { 
    "sessionId1": { 
     "12345645647": 1.0, 
     "9798654": 5.0 

    }, 
    "sessionId2":{ 
     "3445657657": 1.0 

    }, 
    "sessionId3": { 
     "87967976": 5.0, 
     "35325626436": 1.0, 
     "126789435": 1.0, 
     "72139856": 5.0 
    }, 
    "sessionId4": { 
     "4582317": 1.0 
    } 
} 

with open('nested_dict.csv', 'w') as output: 
    writer = csv.writer(output, delimiter='\t') 
    for sessionId in sorted(users_item): 
     ratings = users_item[sessionId] 
     for item in ratings: 
      writer.writerow([sessionId, item, ratings[item]]) 

Итоговые содержимое выходного файла (где » представляет собой символы табуляции):

sessionId1» 12345645647» 1.0 
sessionId1» 9798654»  5.0 
sessionId2» 3445657657» 1.0 
sessionId3» 126789435» 1.0 
sessionId3» 87967976»  5.0 
sessionId3» 35325626436» 1.0 
sessionId3» 72139856»  5.0 
sessionId4» 4582317»  1.0 
+0

спасибо за вашу помощь, но если есть ошибка: '' str 'не поддерживает интерфейс буфера', его ошибка когда 'sessionId' является' str' – Paldro

+0

'sessionId' должен быть строкой, так как ключи словаря' users_item' являются строками, поэтому я не понимаю ошибку. – martineau

+0

в python 3, измените 'wb' на' w', решит ошибку. И все будет хорошо! – Paldro