从嵌套字典到CSV文件

时间:2016-07-19 09:13:40

标签: python python-3.x csv dictionary

我有嵌套字典(长度> 70.000):

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

我想从嵌套字典中创建CSV文件,结果如下:

{{1}}

我发现了这篇文章:Convert Nested Dictionary to CSV Table

它类似于我的问题但是当我尝试所有答案时它无法正常工作, pandas 库耗尽内存

如何使用我的数据创建CSV文件?

4 个答案:

答案 0 :(得分: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]])

答案 1 :(得分:0)

假设您希望每个会话都是一行,每行的列数将是所有会话序列中唯一键的总数。根据您提供的数据,我猜测唯一键的数量是天文数字。

这就是您遇到解决方案given in this discussion的内存问题的原因。一次只能存储在内存中的数据太多了。

如果我的假设是正确的,你唯一的选择是分而治之。将数据分成更小的块并将它们写入csv格式的文件中。然后在最后合并csv文件。

答案 2 :(得分: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

注意 dictuser_items无订单。因此,除非您使用其他方式指定行的顺序,否则输出将按dict内部使用的顺序排列。

编辑:此方法对包含70k条目的文件没有任何问题。

编辑:如果您要写入CSV文件,请使用csv模块或将输出通道传输到文件。

答案 3 :(得分: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