【问题标题】:Unpack a list of nested dictionaries and convert to CSV解压嵌套字典列表并转换为 CSV
【发布时间】:2017-09-23 19:07:46
【问题描述】:

我正在尝试将生成嵌套字典列表的 JSON 写入 CSV,如下所示:

[{'spam': 'xxxx',
  'egg': 'yyyy',
  'line_items': [{'description': 'hhh',
                  'amount': 'iii'},
                 {'description': 'jjj',
                  'amount': 'kkk'}],
  'bacon': 'zzzz'}]

我写了以下代码(对 Python 来说还是很新的):

import csv

jsonData = json.loads(r.text)
keys = list(jsonData[0].keys())
with open(filePathCsv, 'w') as csvfile:
    w = csv.DictWriter(csvfile, keys)
    w.writeheader()
    w.writerows(jsonData)

这会产生以下内容:

CSV output

我需要实现的是:

Expected output

每个嵌套的订单项都会生成一个新行。

我想实现这一点的最佳方法是将我的嵌套字典列表解压缩为一个简单的字典列表,如下所示:

[{'spam': 'xxxx',
  'egg': 'yyyy',
  'description': 'hhh',
  'amount': 'iii',
  'bacon': 'zzzz'},
 {'spam': 'xxxx',
    'egg': 'yyyy',
    'description': 'jjj',
    'amount': 'kkk',
    'bacon': 'zzzz'}]

但我不知道如何实现这一点。

或者也许还有其他方法可以达到我的预期效果?

【问题讨论】:

  • 那么你的问题解决了吗?

标签: python json pandas csv


【解决方案1】:

或者也许还有其他方法可以达到我的预期效果?

如果您使用pandas,则可以使用json_normalize

import pandas as pd

data = [{'spam': 'xxxx',
  'egg': 'yyyy',
  'line_items': [{'description': 'hhh',
                  'amount': 'iii'},
                 {'description': 'jjj',
                  'amount': 'kkk'}],
  'bacon': 'zzzz'}]

df = pd.io.json.json_normalize(data, record_path=['line_items'],
                                meta=['spam', 'egg','bacon'])
df

  amount description   egg  spam bacon
0    iii         hhh  yyyy  xxxx  zzzz
1    kkk         jjj  yyyy  xxxx  zzzz

df.to_csv('out.csv')

【讨论】:

  • 感谢@COLDSPEED!它确实有效!你救了我几根白发!后续问题(如果允许):其他一些字段有字典,如下所示:{'spam': {'match': '139442'}, 'bacon': {'formatted': '2017-08-26'} , 'egg': {'iso8601': '2017-08-29', 'match': '29-AUG-17'} 有没有办法从要分配给“垃圾邮件”的字典中提取/一个值','培根'和'鸡蛋'?我已经浏览了 pandas DataFrame 文档,但找不到任何东西。无论如何,再次感谢!!
  • @Nic0 如果您的问题得到解决...would be nice if you could accept my answer!。而且,要回答您的问题,我认为没有简单的方法可以做到这一点。你想用 pandas 标签打开一个新问题吗?
猜你喜欢
  • 1970-01-01
  • 2014-09-16
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 2017-07-29
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多