我有嵌套字典(长度> 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文件?
答案 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
注意 dict
(user_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