【发布时间】:2015-08-12 20:14:33
【问题描述】:
我有一个结构异构的 Python 字典(检索到的 MongoDB 文档)列表。这种异质性也绝不是直截了当的。所有 dicts 都将包含特定的键子集。一些 dicts 将具有其他人没有的键。两个字典可能具有相同的键,但这些键下的结构可能不同。两个dict的一个键的值可能是每个中的一个列表,但列表的长度可能不同。我需要基本上展平所有的字典并将它们写入 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)
},
}
]
有一些解决方案可以使这些变平,但我也看到了一些大问题。例如,第一个字典有一个answers.emotion_indices 的列表,但第二个字典有一个None。一个“典型的”扁平化方案将表示第一个扁平化键,如'answers.emotion_indices.0'、'answers.emotion_indices.1' 等,而第一个简单地使用'answers.emotion_indices'。 do 具有emotion_indices 列表的字典可能具有不同大小的列表这一事实使事情变得更加复杂。我的数据书呆子朋友(我对他们深表敬意)更愿意看到这个和类似的实例都以'answers.emotion_indices.#' 作为该字段所有记录中最长的列表,以及那些具有较短列表或没有列表的实例只需显示NA 或类似名称。
那么,我的第一个问题是,是否有一种通用的、灵活的方法来展平所有这些 dicts? 或者,该过程是否会简单地找到所有这些不一致并单独处理它们?
我的第二个问题与将所有这些扁平化的字典写入 CSV 文件有关。 csv.DictWriter 类非常灵活地处理键的缺失值。但是,据我所知,它不会动态处理 adding 在实例化 DictWriter
所以,我的第二个问题是,我错了,还是我坚持迭代所有扁平化的字典以收集密钥,制作DictWriter,然后再次迭代所有的字典写它们?或者,有没有更好的方法可以做到这一点,而我没有看到?
请注意,由于我在这里处理的数据量很大,我很可能无法在内存中执行此操作——我将不得不检索 MongoDB 文档、扁平化字典、持久化它们到文件,遍历文件以收集密钥,然后在设置我的DictWriter 后再次遍历文件?
感谢您的宝贵时间!
【问题讨论】:
-
我认为没有其他方法可以处理展平,而不是通过传递来累积可能的键和每个键的可能类型列表,然后再传递以实际生成输出 csv,因为你是更正您不能通过 csv 结构中途添加键。
标签: python mongodb csv dictionary