我有一个Python字典列表(检索到的MongoDB文档),它们在结构上是异构的。这种异质性也不是直截了当的。所有dicts都将包含某个键的子集。一些dicts将拥有其他人没有的密钥。两个dicts可能具有相同的键,但这些键下面的结构可能不同。两个dicts的一个键的值可以是每个中的列表,但列表的长度可以不同。我需要基本上压平所有的dicts并将它们写入CSV文件。以下列出了两个非常简略的示例:
[
{
'answers': {
'age': 25.0,
'emotion_indices': [34.0951, 16.8922, 19.3003],
'hearing_impairments': False,
'music_styles': [
'rock',
'pop',
'classical',
],
'ratings': {
'activity': [4.0, 3.0, 1.0],
'positivity': [5.0, 4.0, 3.0],
},
},
'timestamps': {
'media': [
datetime.datetime(2012, 3, 29, 11, 18, 26),
datetime.datetime(2012, 3, 29, 11, 21, 51),
datetime.datetime(2012, 3, 29, 11, 24, 13)
],
},
},
{
'answers': {
'age': 16.0,
'emotion_indices': None,
'hearing_impairments': False,
'music_styles': [
'rock',
'pop',
],
'ratings': {
'activity': [2.0, 4.0, 2.0, 2.0],
'like_dislike': [1.0, 4.0, 2.0, 1.0],
'positivity': [1.0, 4.0, 1.0, 2.0],
},
},
'timestamps': {
'media': [
datetime.datetime(2010, 7, 13, 19, 9, 50),
datetime.datetime(2010, 7, 13, 19, 13, 26),
datetime.datetime(2010, 7, 13, 19, 16, 2),
datetime.datetime(2010, 7, 13, 19, 18, 1)],
'test': datetime.datetime(2010, 7, 13, 19, 8, 36)
},
}
]
有解决这些问题的方法,但我也看到了大问题。例如,第一个dict有answers.emotion_indices
的列表,但第二个有None
。 “典型”扁平化方案将代表第一个使用扁平键(如'answers.emotion_indices.0'
,'answers.emotion_indices.1'
等),第一个仅使用'answers.emotion_indices'
。 做具有emotion_indices
列表的词典可能具有不同大小的列表,这进一步使事情复杂化。我的数据书呆子朋友(我非常尊重他们)更愿意看到这个和类似的实例都用尽可能多的'answers.emotion_indices.#'
作为该字段的所有记录中最长的列表,以及那些具有较短列表或没有列表只显示NA
或类似。
所以,我的第一个问题是,是否有一种通用的,灵活的方式来压缩所有这些词汇?或者,流程是否会充满找到所有这些不一致并单独处理它们?
我的第二个问题与将所有这些扁平的dicts写入CSV文件有关。 csv.DictWriter
类非常灵活地处理键的缺少值。但是,据我所知,在实例化DictWriter
所以,我的第二个问题是,我在这方面是错误的,还是我在第一次收集密钥,制作DictWriter
之后迭代所有扁平的dicts,然后迭代所有的再次写出来吗?或者,有没有更好的方法来做到这一点,我没有看到?
请注意,由于我在这里玩杂耍的数据量很大,我很可能无法在内存中执行此操作 - 我必须检索MongoDB文档,压扁dicts,坚持使用它们对文件进行迭代,遍历文件以收集密钥,然后在设置DictWriter
后再次遍历文件?
谢谢你的时间!
答案 0 :(得分:0)
展平机制取决于您想要对展平文件执行的操作。如果你想使用python进行进一步处理,那么酸洗可能是个不错的选择。另一个选择可能是repr。