【问题标题】:Convert Json with sub fields to CSV in python在python中将带有子字段的Json转换为CSV
【发布时间】:2019-08-19 19:11:51
【问题描述】:

我有一个带有示例 JSON 输出的文件,如下所示: jsonoutput.txt 文件:

[{"fruit": "orange", "id":1, "countries": ["Portugal"], "color": "Orange"}

{"fruit": "apple", "id":2, "countries": ["Portugal"], "color": "red"}]

我需要输出 csv 作为(excel 文件):

fruit id countries color
orange 1 Portugal Orange
apple 2  Spain     red

现在,我越来越像 水果 id 国家颜色 橙色 1 [u'葡萄牙'] 橙色 苹果 2 [u'Spain'] 红色

如何从国家/地区中删除 [] 、 u 和 '' ?

print (json.dumps(fruits)) -- 在 json 输出中给我

这是我尝试将 json 转换为 xlsx:

data= tablib.Dataset(headers=('Fruit','id','Countries','Color'))
importfile = 'jsonoutput.txt'
data.json = open(importfile. 'r').read()
data_export = data.export('xlsx')
with open('output.xlsx','wb') as f:
    f.write(data_export)
    f.close()

【问题讨论】:

    标签: python json csv tablib


    【解决方案1】:

    你可以使用pandas.io.json.json_normalize

    import pandas as pd
    from pandas.io.json import json_normalize
    
    d = [
        {"fruit": "orange", "id":1, "countries": ["Portugal"], "color": "Orange"},
        {"fruit": "apple", "id":2, "countries": ["Portugal"], "color": "red"}
    ]
    
    df = pd.concat([json_normalize(d[i]) for i in range(len(d))], ignore_index=True)
    df['countries'] = df['countries'].str.join(' ')
    

        fruit   id  countries   color
    0   orange  1   Portugal    Orange
    1   apple   2   Portugal    red
    

    要将其保存为.xlsx 文件,请使用:

    df.to_excel('filename.xlsx', index=False)
    

    编辑:

    json_normalize 是将半结构化 JSON 数据标准化为平面表的函数。

    我现在意识到我的代码可以简化为:

    df = json_normalize(d) # no need for `pd.concat`
    
    ### Output:
    #   fruit   id  countries   color
    # 0 orange  1   ['Portugal']    Orange
    # 1 apple   2   ['Portugal']    red
    

    为了从countries 列中删除[],我使用了pandas.Series.str.join,即pandas'相当于Python 的str.join

    这是必需的,因为最初countries 列是一个包含元素的列表

    df['countries'] = df['countries'].str.join(' ')
    

    一旦您加入项目,countries 列将不再是列表:

        fruit   id  countries   color
    0   orange  1   Portugal    Orange
    1   apple   2   Portugal    red
    

    【讨论】:

    • 谢谢,它成功了。您能否向我解释一下最后两个命令,因为我对 pandas 很陌生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2015-08-07
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多