2017-09-23 77 views
0

我试图写CSV产生嵌套dictionnaries列表如下一个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

每个嵌套行项目产生一个新行。

我想实现这一目标的最好办法就是解开我的嵌套dictionnaries的列表dictionnaries的简单列表,就像这样:

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

但我很茫然就如何实现这一目标。

或者也许有另一种方法来实现我的预期结果?

+0

所以是你的问题解决了吗? –

回答

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') 
+0

谢谢@COLDSPEED!它确实有效!你救了我几根灰头发!后续的问题,如果允许的话:其他一些字段有一个字典,如下所示: {'spam':{'match':'139442'}, 'bacon':{'formatted':'2017-08-26 '}, 'egg':{'iso8601':'2017-08-29','match':'29 -AUG-17'} 有没有办法从字典中提取/ one值为分配给“垃圾邮件”,“培根”和“蛋”? 我已经通过熊猫DataFrame文档,但找不到任何东西。 无论如何,再次感谢! – Nic0

+0

@ Nic0如果你的问题已经解决...... [如果你能接受我的回答,会很好](https://stackoverflow.com/help/someone-answers)。而且,为了回答你的问题,我不相信有一个简单的方法可以做到这一点。你想用熊猫标签打开一个新问题吗? –