从异构Python词典创建CSV文件

时间:2015-08-12 20:14:33

标签: python mongodb csv dictionary

我有一个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后再次遍历文件?

谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

展平机制取决于您想要对展平文件执行的操作。如果你想使用python进行进一步处理,那么酸洗可能是个不错的选择。另一个选择可能是repr。