繁体   English   中英

从嵌套字典到CSV文件

[英]From Nested Dictionary to CSV File

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

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
.......

我发现这篇文章: 将嵌套字典转换为CSV表

这与我的问题类似,但是当我尝试所有答案时,它不起作用, pandas库耗尽内存

如何用我的数据制作CSV文件?

只需遍历字典并使用Python csv编写器写入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]])
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模块或仅将输出通过管道传输到文件。

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

这就是为什么你在本讨论中给出的解决方案遇到了内存问题。 一次只能存储在内存中的数据太多了。

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

如果您迭代地写入文件,应该没有内存问题:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM