【问题标题】:Creating a CSV file from heterogeneous Python dictionaries从异构 Python 字典创建 CSV 文件
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我想创建一个 CSV 文件——就是这样。我并不真正关心生成文件后会发生什么。 picklerepr 真的与我在这里问的没有任何关系。
猜你喜欢
  • 2016-09-03
  • 2021-05-15
  • 2016-11-20
  • 2011-10-08
  • 2012-12-15
  • 2012-01-02
  • 2016-11-22
相关资源
最近更新 更多