首页 > 解决方案 > 使用 python 将 Excel 转换为 JSON 格式

问题描述

我有一个以下格式的 excel 表

在此处输入图像描述

我想使用 Python 将此 Excel 表转换为 JSON 格式。每个 JSON 对象都是以下格式的对角线值和列标题。

{
"Records": [
    {
        "RecordId": "F1",
        "Assets": [
            {
                "AssetId": "A1",
                "Support": "S11"
            },
            {
                "AssetId": "A2",
                "Support": "S12"
            },
            {
                "AssetId": "A3",
                "Support": "S13"
            }
        ]
    },
    {
        "RecordId": "F2",
        "Assets": [
            {
                "AssetId": "A1",
                "Support": "S21"
            },
            {
                "AssetId": "A2",
                "Support": "S22"
            },
            {
                "AssetId": "A3",
                "Support": "S23"
            }
        ]
    }
]

}

我写了一些代码,它似乎没有按我的预期工作。

import json
import pandas as pd
  
df = pd.read_excel (r'test.xlsx', sheet_name='Sheet2')
#initialize data
data=[0 for i in range(len(df))]
datac=[0 for c in range(len(df.columns))]
newset=dict()


for i in range(len(df)):
    # data[i] = r'{"'+str(df.columns.values[0])+'": "' +str(df.loc[i][0])+'", '+str(df.columns.values[1])+'": "' +str(df.loc[i][1])+'", '+str(df.columns.values[2])+'": "' +str(df.loc[i][2])+'"}' 
    #data[i] = {str(df.columns.values[1]) : str(df.loc[i][0]), str(df.columns.values[1]):  str(df.loc[i][1]), str(df.columns.values[2]): str(df.loc[i][2])}
    for c in range(1,len(df.columns)):
        #data[i] = {str('RecordId') : str(df.loc[i][0]),str('Assets'):[{"AssetId": str(df.columns.values[c]),"Support": str(df.loc[i][c])}]}
        datac[c] = {"AssetId": str(df.columns.values[c]),"Support": str(df.loc[i][c])}
    data[i]={str('RecordId') : str(df.loc[i][0]),str('Assets'):datac[c]}
    print(data[i])
output_lines = [json.dumps(line)+",\n" for line in data]
output_lines[-1] =   output_lines[-1][:-2] # remove ",\n" from last line
with open(r'Savedwork.json', 'w') as json_file:
        json_file.writelines(output_lines)

标签: pythonexcelpandas

解决方案


您需要的是iterrows()方法,它将作为(索引,系列)对迭代数据框的行。该columns()方法将为您提供列名列表,因此您将能够遍历系列中的列,并按名称访问它们。

import json
import pandas as pd

df = pd.read_excel('test.xlsx')

recs = []
for i, row in df.iterrows():
    rec = {
        'RecordId': row[0],
        'Assets': [{'AssetId': c, 'Support': row[c]} for c in df.columns[1:]]
    }
    recs.append(rec)

out = {'Records': recs}

(是的,这一切都可以在一个列表理解中完成,但滥用这些会妨碍可读性)

此外,你不需要json.dumps在行上做,然后用换行符组装它们(不要在文本级别工作):用整个数据构建一个字典,然后 json.dump :

print(json.dumps(out, indent=4))

推荐阅读